Skip to content

Commit 0e461dd

Browse files
authored
Blog 컴포넌트 관련 구현 (#306)
* feat(constants): link * feat(api-post-like): postLike 구현 및 적용 * feat(lib-utility): seo post 추가 * feat(modules): link * feat(modules): header * feat(modules): like * feat(modules): writer * feat(modules): index * feat(hooks-like): like mutation, hasLike query * feat(hooks): isOwner hooks * feat(hooks-react-query-post): postDetailQuery * feat(page): page 컴포넌트 결합 * feat: _app root component에 포지션값 추가
1 parent 14d5c66 commit 0e461dd

24 files changed

+477
-76
lines changed

constants/post/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import POSTCARD_ALL_CATEGORY_TITLE from "./card/title";
22

3+
export * from "./link";
34
export { POSTCARD_ALL_CATEGORY_TITLE };

constants/post/link.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import LANGUAGE from "@Library/language/constant";
2+
3+
import { LanguageInterface } from "@Library/language/interface";
4+
5+
export const DIRECT_OWNER_BLOG: LanguageInterface = {
6+
[LANGUAGE.ko]: "의 TILog",
7+
[LANGUAGE.en]: "'s TILog",
8+
};
9+
10+
export const POST_EDIT: LanguageInterface = {
11+
[LANGUAGE.ko]: "수정",
12+
[LANGUAGE.en]: "Edit",
13+
};
14+
15+
export const POST_DELETE: LanguageInterface = {
16+
[LANGUAGE.ko]: "삭제",
17+
[LANGUAGE.en]: "Delete",
18+
};

lib/api/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import authService from "@Library/api/auth";
22
import categoryService from "@Library/api/category";
3-
import postService from "@Library/api/post";
3+
import { postService, postLikeService } from "@Library/api/post";
44
import usersService from "@Library/api/users";
55

66
export default {
77
authService,
88
usersService,
99
categoryService,
1010
postService,
11+
postLikeService,
1112
};

lib/api/post/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import { TILOG_API } from "@Constants/environment";
22
import httpClient from "@Library/api/httpClient";
3+
import PostLikeRepository from "@Library/api/post/like/postLikeRepository";
4+
import PostLikeService from "@Library/api/post/like/postLikeService";
35
import PostRepository from "@Library/api/post/postRepository";
46
import PostService from "@Library/api/post/postService";
57

68
const postRepository = new PostRepository(httpClient.http, TILOG_API);
7-
const postService = new PostService(postRepository, httpClient.http);
9+
const postLikeRepository = new PostLikeRepository(httpClient.http, TILOG_API);
810

9-
export default postService;
11+
const postService = new PostService(postRepository);
12+
const postLikeService = new PostLikeService(postLikeRepository);
13+
14+
export { postService, postLikeService };
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default interface GetPostDetailRequestDto {
2+
postId: string;
3+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {
2+
SetLikedRequestDto,
3+
UnsetLikedRequestDto,
4+
} from "@til-log.lab/tilog-api";
5+
6+
type LikedRequestDto =
7+
| SetLikedRequestDto["postId"]
8+
| UnsetLikedRequestDto["postId"];
9+
10+
export default LikedRequestDto;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default interface PostHasLikeDto {
2+
postId: string;
3+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { AxiosInstance } from "axios";
2+
3+
import { Configuration, PostLikeApi } from "@til-log.lab/tilog-api";
4+
5+
export default class PostLikeRepository extends PostLikeApi {
6+
constructor(
7+
axios?: AxiosInstance,
8+
basePath?: string,
9+
configuration?: Configuration
10+
) {
11+
super(configuration, basePath, axios);
12+
}
13+
}

lib/api/post/like/postLikeService.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { AxiosRequestConfig, AxiosResponse } from "axios";
2+
3+
import validateToken from "@Library/api/auth/validateTokenDecorator";
4+
import PostLikeRepository from "@Library/api/post/like/postLikeRepository";
5+
6+
import {
7+
HasLikedResponseDto,
8+
SetLikedRequestDto,
9+
UnsetLikedRequestDto,
10+
} from "@til-log.lab/tilog-api";
11+
12+
import ExceptionInterface from "@Library/api/exception/interface";
13+
import LikedRequestDto from "@Library/api/post/like/interface/LikedRequestDto";
14+
import PostHasLikeDto from "@Library/api/post/like/interface/postHasLikeDto";
15+
16+
export default class PostLikeService {
17+
constructor(private readonly postLikeRepository: PostLikeRepository) {}
18+
19+
@validateToken()
20+
private setLike(
21+
postId: SetLikedRequestDto["postId"],
22+
options?: AxiosRequestConfig
23+
): Promise<AxiosResponse<void, ExceptionInterface>> {
24+
const setLikedRequestDto: SetLikedRequestDto = {
25+
postId,
26+
};
27+
return this.postLikeRepository.postsLikeControllerSetLike(
28+
setLikedRequestDto,
29+
options
30+
);
31+
}
32+
33+
@validateToken()
34+
private unsetLike(
35+
postId: UnsetLikedRequestDto["postId"],
36+
options?: AxiosRequestConfig
37+
): Promise<AxiosResponse<void, ExceptionInterface>> {
38+
const unsetLikedRequestDto: UnsetLikedRequestDto = {
39+
postId,
40+
};
41+
return this.postLikeRepository.postsLikeControllerUnsetLike(
42+
unsetLikedRequestDto,
43+
options
44+
);
45+
}
46+
47+
@validateToken()
48+
hasLiked(
49+
postId: PostHasLikeDto["postId"],
50+
options?: AxiosRequestConfig
51+
): Promise<AxiosResponse<HasLikedResponseDto, ExceptionInterface>> {
52+
return this.postLikeRepository.postsLikeControllerHasLiked(postId, options);
53+
}
54+
55+
async toggleLike(
56+
postId: LikedRequestDto,
57+
options?: AxiosRequestConfig
58+
): Promise<AxiosResponse<void, ExceptionInterface>> {
59+
const { data } = await this.hasLiked(postId, options);
60+
const isLiked = data.like;
61+
62+
if (isLiked) return this.unsetLike(postId, options);
63+
return this.setLike(postId, options);
64+
}
65+
}

lib/api/post/postService.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from "axios";
1+
import { AxiosRequestConfig, AxiosResponse } from "axios";
22

33
import validateToken from "@Library/api/auth/validateTokenDecorator";
44
import PostRepository from "@Library/api/post/postRepository";
@@ -14,10 +14,7 @@ import ExceptionInterface from "@Library/api/exception/interface";
1414
import GetPostRequestDto from "@Library/api/post/interface/getPostRequestDto";
1515

1616
export default class PostService {
17-
constructor(
18-
private readonly postRepository: PostRepository,
19-
private readonly axios: AxiosInstance
20-
) {}
17+
constructor(private readonly postRepository: PostRepository) {}
2118

2219
@validateToken()
2320
createPost(

0 commit comments

Comments
 (0)