Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
"@typescript-eslint/no-explicit-any": "warn",
"import/extensions": ["off"],
"import/first": ["error"],
"import/named": ["error"],
"import/no-duplicates": ["error"],
"import/no-extraneous-dependencies": ["off"],
"import/no-relative-packages": ["off"],
Expand All @@ -32,6 +31,7 @@
}
],
"unused-imports/no-unused-imports": ["error"],
"react-hooks/exhaustive-deps": ["off"],
"@typescript-eslint/naming-convention": ["off"]
}
}
2 changes: 1 addition & 1 deletion app/__test__/utils/utils.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Model } from 'mongoose';
import { getThumbnailInMarkdown } from '@/app/lib/utils/parse';
import { createPostSlug, generateUniqueSlug } from '@/app/lib/utils/post';
import type { Post } from '@/app/types/Post';
import { Model } from 'mongoose';
describe('마크다운에서 이미지 경로 추출 함수 테스트', () => {
it('마크다운에서 이미지 경로 추출', () => {
const content = `
Expand Down
6 changes: 3 additions & 3 deletions app/admin/comments/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
'use client';

import { useEffect, useState } from 'react';
import { useSession } from 'next-auth/react';
import { useRouter } from 'next/navigation';
import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { useSession } from 'next-auth/react';
import { useEffect, useState } from 'react';
import IssueCard from '@/app/entities/admin/comments/IssueCard';

interface GitHubUser {
Expand Down
2 changes: 1 addition & 1 deletion app/admin/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client';
import { SessionProvider } from 'next-auth/react';
import ProtectedRoute from '@/app/entities/common/Layout/ProtectedRoute';
import { Suspense } from 'react';
import ProtectedRoute from '@/app/entities/common/Layout/ProtectedRoute';
import SVGLoadingSpinner from '@/app/entities/common/Loading/SVGLoadingSpinner';

interface AdminPageLayoutProps {
Expand Down
20 changes: 9 additions & 11 deletions app/admin/page.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
'use client';
import Link from 'next/link';
import { signIn, signOut, useSession } from 'next-auth/react';

import { RiFileTextLine } from 'react-icons/ri';
import { BiFolder } from 'react-icons/bi';
import { HiBookOpen } from 'react-icons/hi';
import { useEffect } from 'react';
import { BiFolder , BiCommentDetail } from 'react-icons/bi';
import { FaChartBar } from 'react-icons/fa';
import { BiCommentDetail } from 'react-icons/bi';
import { FaBuffer } from 'react-icons/fa6';
import { HiBookOpen } from 'react-icons/hi';
import { IoSettingsSharp } from 'react-icons/io5';
import Link from 'next/link';
import GithubLogin from '@/app/entities/common/Button/GithubLogin';
import { RiFileTextLine } from 'react-icons/ri';
import QuickStats from '@/app/entities/admin/dashboard/QuickStats';
import RecentActivity from '@/app/entities/admin/dashboard/RecentActivity';
import BubbleBackground from '@/app/entities/common/Background/BubbleBackground';
import { useEffect } from 'react';
import GithubLogin from '@/app/entities/common/Button/GithubLogin';
import useToast from '@/app/hooks/useToast';
import { FaBuffer } from 'react-icons/fa6';
import RecentActivity from '@/app/entities/admin/dashboard/RecentActivity';
import QuickStats from '@/app/entities/admin/dashboard/QuickStats';
import DecryptedText from '../entities/bits/DecryptedText';

const AdminDashboard = () => {
Expand Down
12 changes: 6 additions & 6 deletions app/admin/posts/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
'use client';
import { useEffect, useState } from 'react';
import { Post } from '@/app/types/Post';
import axios from 'axios';
import PostListItem from '@/app/entities/post/list/PostListItem';
import DeleteModal from '@/app/entities/common/Modal/DeleteModal';
import { deletePost } from '@/app/entities/post/api/postAPI';
import { useRouter, useSearchParams } from 'next/navigation';
import { useEffect, useState } from 'react';
import LoadingIndicator from '@/app/entities/common/Loading/LoadingIndicator';
import useToast from '@/app/hooks/useToast';
import DeleteModal from '@/app/entities/common/Modal/DeleteModal';
import Pagination from '@/app/entities/common/Pagination';
import { deletePost } from '@/app/entities/post/api/postAPI';
import PostListItem from '@/app/entities/post/list/PostListItem';
import useToast from '@/app/hooks/useToast';
import { Post } from '@/app/types/Post';

const AdminPostListPage = () => {
const [posts, setPosts] = useState<Post[]>([]);
Expand Down
14 changes: 7 additions & 7 deletions app/admin/series/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
'use client';
import { Series } from '@/app/types/Series';
import useDataFetch, {
useDataFetchConfig,
} from '@/app/hooks/common/useDataFetch';
import { useState } from 'react';
import AdminSeriesList from '@/app/entities/series/list/AdminSeriesList';
import DeleteModal from '@/app/entities/common/Modal/DeleteModal';
import Overlay from '@/app/entities/common/Overlay/Overlay';
import CreateSeriesOverlayContainer from '@/app/entities/series/CreateSeriesOverlayContainer';
import { deleteSeries } from '@/app/entities/series/api/series';
import DeleteModal from '@/app/entities/common/Modal/DeleteModal';
import CreateSeriesOverlayContainer from '@/app/entities/series/CreateSeriesOverlayContainer';
import AdminSeriesList from '@/app/entities/series/list/AdminSeriesList';
import useDataFetch, {
useDataFetchConfig,
} from '@/app/hooks/common/useDataFetch';
import { Series } from '@/app/types/Series';
const AdminSeriesPage = () => {
const [seriesList, setSeriesList] = useState<Series[] | null>(null);
const getSeriesListConfig: useDataFetchConfig = {
Expand Down
1 change: 0 additions & 1 deletion app/admin/write/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Suspense } from 'react';
import LoadingIndicator from '@/app/entities/common/Loading/LoadingIndicator';
import BlogFormSkeleton from '@/app/entities/common/Skeleton/BlogFormSkeleton';

interface LayoutProps {
Expand Down
2 changes: 1 addition & 1 deletion app/admin/write/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import BlogForm from '@/app/entities/post/write/BlogForm';
import { Metadata } from 'next';
import BlogForm from '@/app/entities/post/write/BlogForm';

export const generateMetadata = async (): Promise<Metadata> => {
return {
Expand Down
6 changes: 3 additions & 3 deletions app/api/admin/posts/recent/route.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
// GET /api/admin/posts/recent - 관리자용 최근 게시글 조회
import Post from '@/app/models/Post';
import dbConnect from '@/app/lib/dbConnect';
import { getServerSession } from 'next-auth';
import dbConnect from '@/app/lib/dbConnect';
import Post from '@/app/models/Post';

export const dynamic = 'force-dynamic';

export async function GET(req: Request) {
export async function GET() {
try {
const session = await getServerSession();
if (!session) {
Expand Down
6 changes: 3 additions & 3 deletions app/api/admin/stats/route.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// GET /api/admin/stats - 관리자용 블로그 통계
import { getServerSession } from 'next-auth';
import dbConnect from '@/app/lib/dbConnect';
import Post from '@/app/models/Post';
import Series from '@/app/models/Series';
import dbConnect from '@/app/lib/dbConnect';
import { getServerSession } from 'next-auth';

export const dynamic = 'force-dynamic';

export async function GET(req: Request) {
export async function GET() {
try {
const session = await getServerSession();
if (!session) {
Expand Down
4 changes: 2 additions & 2 deletions app/api/posts/[slug]/route.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// app/api/posts/[slug]/route.ts
import dbConnect from '@/app/lib/dbConnect';
import Post from '@/app/models/Post';
import { NextRequest, NextResponse } from 'next/server';
import dbConnect from '@/app/lib/dbConnect';
import { getThumbnailInMarkdown } from '@/app/lib/utils/parse';
import Post from '@/app/models/Post';
import Series from '@/app/models/Series';

export async function GET(
Expand Down
2 changes: 1 addition & 1 deletion app/api/posts/like/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Like from '@/app/models/Like';
import { NextRequest } from 'next/server';
import dbConnect from '@/app/lib/dbConnect';
import Like from '@/app/models/Like';

export const POST = async (request: Request) => {
const { postId } = await request.json();
Expand Down
2 changes: 1 addition & 1 deletion app/api/posts/popular/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import dbConnect from '@/app/lib/dbConnect';
import View from '@/app/models/View';
import Post from '@/app/models/Post';
import View from '@/app/models/View';

export const GET = async () => {
await dbConnect();
Expand Down
2 changes: 1 addition & 1 deletion app/api/posts/recent/route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// app/api/posts/latest/route.ts
import Post from '@/app/models/Post';
import dbConnect from '@/app/lib/dbConnect';
import { formatDate } from '@/app/lib/utils/format';
import Post from '@/app/models/Post';

export const dynamic = 'force-dynamic'; // 항상 최신 데이터를 가져오기 위한 설정

Expand Down
2 changes: 1 addition & 1 deletion app/api/posts/recommendation/route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import dbConnect from '@/app/lib/dbConnect';
import Like from '@/app/models/Like';
import Post from '@/app/models/Post';
import View from '@/app/models/View';
import Like from '@/app/models/Like';

export const GET = async (request: Request) => {
await dbConnect();
Expand Down
8 changes: 4 additions & 4 deletions app/api/posts/route.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
// GET /api/posts - 모든 글 조회 (페이지네이션 지원)
import { QuerySelector } from 'mongoose';
import Series from '@/app/models/Series';
import dbConnect from '@/app/lib/dbConnect';
import Post from '@/app/models/Post';
import { getServerSession } from 'next-auth';
import { generateUniqueSlug } from '@/app/lib/utils/post';
import dbConnect from '@/app/lib/dbConnect';
import { getThumbnailInMarkdown } from '@/app/lib/utils/parse';
import { generateUniqueSlug } from '@/app/lib/utils/post';
import Post from '@/app/models/Post';
import Series from '@/app/models/Series';

export async function GET(req: Request) {
try {
Expand Down
2 changes: 1 addition & 1 deletion app/api/posts/view/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import View from '@/app/models/View';
import { NextRequest } from 'next/server';
import dbConnect from '@/app/lib/dbConnect';
import View from '@/app/models/View';

export const POST = async (request: Request) => {
const { postId } = await request.json();
Expand Down
2 changes: 1 addition & 1 deletion app/api/redirect/recent/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { NextResponse } from 'next/server';
import Post from '@/app/models/Post';
import dbConnect from '@/app/lib/dbConnect';
import Post from '@/app/models/Post';

export const dynamic = 'force-dynamic'; // 캐싱 방지

Expand Down
2 changes: 1 addition & 1 deletion app/api/rss/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { generateRssFeed } from '@/app/lib/rss';
import { NextResponse } from 'next/server';
import dbConnect from '@/app/lib/dbConnect';
import { generateRssFeed } from '@/app/lib/rss';
import Post from '@/app/models/Post';

export async function GET() {
Expand Down
2 changes: 1 addition & 1 deletion app/api/series/[slug]/route.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import dbConnect from '@/app/lib/dbConnect';
import Series from '@/app/models/Series';
import '@/app/models/Post';
import { getServerSession } from 'next-auth';

export async function GET(
request: Request,
Expand Down
4 changes: 2 additions & 2 deletions app/api/series/route.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import dbConnect from '@/app/lib/dbConnect';
import Series from '@/app/models/Series';
import { createPostSlug } from '@/app/lib/utils/post';
import { getServerSession } from 'next-auth';
import Series from '@/app/models/Series';

export async function POST(request: Request) {
try {
Expand Down
2 changes: 1 addition & 1 deletion app/api/upload/route.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { handleUpload, type HandleUploadBody } from '@vercel/blob/client';
import { NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { handleUpload, type HandleUploadBody } from '@vercel/blob/client';

export async function POST(request: Request): Promise<NextResponse> {
const session = await getServerSession();
Expand Down
2 changes: 1 addition & 1 deletion app/entities/admin/comments/IssueCard.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client';

import { useState } from 'react';
import Link from 'next/link';
import { useState } from 'react';
import CommentItem from './CommentItem';

interface GitHubUser {
Expand Down
2 changes: 1 addition & 1 deletion app/entities/admin/dashboard/RecentActivity.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client';

import { useEffect, useState } from 'react';
import Link from 'next/link';
import { useEffect, useState } from 'react';
import { formatDate } from '@/app/lib/utils/format';

interface RecentPost {
Expand Down
2 changes: 1 addition & 1 deletion app/entities/bits/DecryptedText.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useEffect, useState, useRef } from 'react';
import { motion, HTMLMotionProps } from 'motion/react';
import { useEffect, useState, useRef } from 'react';

interface DecryptedTextProps extends HTMLMotionProps<'span'> {
text: string;
Expand Down
1 change: 0 additions & 1 deletion app/entities/comment/Comments.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import { useEffect, useState } from 'react';
import Skeleton from '@/app/entities/common/Skeleton/Skeleton';
import useTheme from '@/app/hooks/useTheme';
import SVGLoadingSpinner from '@/app/entities/common/Loading/SVGLoadingSpinner';

// 실제 댓글 렌더링을 담당하는 별도 컴포넌트
const UtterancesComments = ({ theme }: { theme: string }) => {
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Animation/NotFound.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Link from 'next/link';
import LottiePlayer from '@/app/entities/common/Animation/LottiePlayer';
import NotFoundAnimation from '@/app/public/assets/notfound2.json';
import Link from 'next/link';

interface NotFoundProps {
message?: string;
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Layout/ProtectedRoute.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client';
import { useEffect } from 'react';
import { signIn, useSession } from 'next-auth/react';
import { useEffect } from 'react';

interface ProtectedRouteProps {
children: React.ReactNode;
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Loading/LoadingIndicator.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client';
import animation from '@/app/public/assets/loadingAnimation1.json';
import dynamic from 'next/dynamic';
import animation from '@/app/public/assets/loadingAnimation1.json';

interface LoadingIndicatorProps {
message?: string;
Expand Down
4 changes: 2 additions & 2 deletions app/entities/common/NavBar.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
'use client';
import Link from 'next/link';
import { useEffect, useState } from 'react';
import Profile from '@/app/entities/common/Profile';
import { IoMoonSharp, IoSunnySharp } from 'react-icons/io5';
import IconButton from '@/app/entities/common/Button/IconButton';
import Profile from '@/app/entities/common/Profile';
import useTheme from '@/app/hooks/useTheme';
import { IoMoonSharp, IoSunnySharp } from 'react-icons/io5';
const NavBar = () => {
const [isFixed, setIsFixed] = useState(false);
const { theme, toggleTheme } = useTheme();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { FaSearch } from 'react-icons/fa';
import Tag from '@/app/entities/common/Tag';
import { FaX } from 'react-icons/fa6';
import Tag from '@/app/entities/common/Tag';

const SearchOverlayContainer = (props: {
setQuery: (query: string) => void;
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Pagination.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
'use client';

import React from 'react';
import Link from 'next/link';
import { usePathname, useSearchParams } from 'next/navigation';
import React from 'react';

interface PaginationProps {
totalItems: number;
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Profile.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { StaticImport } from 'next/dist/shared/lib/get-img-props';
import React from 'react';
import Image from 'next/image';
import React from 'react';

interface Props {
profileThumbnail?: string | StaticImport;
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Skeleton/SeriesGridSkeleton.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import SeriesPreviewSkeleton from '@/app/entities/common/Skeleton/SeriesPreviewSkeleton';
import React from 'react';
import SeriesPreviewSkeleton from '@/app/entities/common/Skeleton/SeriesPreviewSkeleton';

const SeriesGridSkeleton = () => {
return (
Expand Down
2 changes: 1 addition & 1 deletion app/entities/common/Skeleton/SeriesPreviewSkeleton.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Skeleton from '@/app/entities/common/Skeleton/Skeleton';
import React from 'react';
import Skeleton from '@/app/entities/common/Skeleton/Skeleton';

const SeriesPreviewSkeleton = () => {
const darkmodeStyle = `dark:bg-neutral-900 dark:text-neutral-200 dark:border-neutral-800`;
Expand Down
2 changes: 1 addition & 1 deletion app/entities/portfolio/PortfolioPreview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
import Image from 'next/image';
import Link from 'next/link';
import { useState } from 'react';
import { Project } from '@/app/types/Portfolio';
import { FaGithub, FaGlobe } from 'react-icons/fa';
import { Project } from '@/app/types/Portfolio';

interface PortfolioPreviewProps {
project: Project;
Expand Down
Loading