post.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. 'use server';
  2. import PostReactionRequest from '@/dtos/request/forum/post/postReactionRequest';
  3. import PostBookmarkRequest from '@/dtos/request/forum/post/postBookmarkRequest';
  4. import PostReportRequest from '@/dtos/request/forum/post/postReportRequest';
  5. import PostFileDownLogRequest from '@/dtos/request/forum/post/postFileDownLogRequest';
  6. import PostCreateResponse from '@/dtos/response/forum/post/postCreateResponse';
  7. import PostUpdateResponse from '@/dtos/response/forum/post/postUpdateResponse';
  8. import PostResponse from '@/dtos/response/forum/post/postResponse';
  9. import { ResultDto } from '@/dtos/response/common';
  10. import { fetchJson } from '@/lib/utils/server';
  11. // 게시글 등록
  12. export async function fetchPostCreate(formData: FormData): Promise<ResultDto<PostCreateResponse>> {
  13. return await fetchJson<PostCreateResponse>('/api/forum/posts', {
  14. method: 'POST',
  15. headers: {'Accept': 'application/json'},
  16. body: formData
  17. });
  18. }
  19. // 게시글 정보 조회
  20. export async function fetchPostData(postID: number): Promise<ResultDto<PostResponse>> {
  21. const post = await fetchJson<PostResponse>(`/api/forum/posts/${postID}`, {
  22. method: 'GET',
  23. headers: {
  24. 'Accept': 'application/json'
  25. }
  26. });
  27. if (post.success && post.data) {
  28. // 이미지 URL 변경
  29. post.data.content = post.data.content.replace(/<img\b[^>]*?\bsrc=["']?(\/[^"'\s>]*)["']?/gi, (match, src) => {
  30. return match.replace(src, process.env.API_URL + src);
  31. });
  32. }
  33. return post;
  34. }
  35. // 게시글 반응(좋아요/싫어요) 처리
  36. export async function fetchPostReaction(params: PostReactionRequest): Promise<ResultDto> {
  37. return await fetchJson(`/api/forum/posts/${params.postID}/reaction`, {
  38. method: 'POST',
  39. headers: {
  40. 'Accept': 'application/json',
  41. 'Content-Type': 'application/json'
  42. },
  43. body: JSON.stringify({ reaction: params.reaction })
  44. });
  45. }
  46. // 게시글 즐겨찾기 처리
  47. export async function fetchPostBookmark(params: PostBookmarkRequest): Promise<ResultDto> {
  48. return await fetchJson(`/api/forum/posts/${params.postID}/bookmark`, {
  49. method: 'POST',
  50. headers: {
  51. 'Accept': 'application/json',
  52. 'Content-Type': 'application/json'
  53. }
  54. });
  55. }
  56. // 게시글 신고
  57. export async function fetchReport(params: PostReportRequest): Promise<ResultDto> {
  58. return await fetchJson(`/api/forum/posts/${params.postID}/report`, {
  59. method: 'POST',
  60. headers: {
  61. 'Accept': 'application/json',
  62. 'Content-Type': 'application/json'
  63. },
  64. body: JSON.stringify({ type: params.type, reason: params.reason })
  65. });
  66. }
  67. // 게시글 삭제
  68. export async function fetchPostDelete(postID: number): Promise<ResultDto> {
  69. return await fetchJson(`/api/forum/posts/${postID}`, {
  70. method: 'DELETE',
  71. headers: {
  72. 'Accept': 'application/json'
  73. }
  74. });
  75. }
  76. // 게시글 수정
  77. export async function fetchPostUpdate(postID: number, formData: FormData): Promise<ResultDto<PostUpdateResponse>> {
  78. return await fetchJson<PostUpdateResponse>(`/api/forum/posts/${postID}`, {
  79. method: 'PUT',
  80. headers: {
  81. 'Accept': 'application/json',
  82. },
  83. body: formData
  84. });
  85. }
  86. // 파일 다운로드 기록
  87. export async function fetchFileDownLog(params: PostFileDownLogRequest): Promise<ResultDto<PostUpdateResponse>> {
  88. return await fetchJson<PostUpdateResponse>(`/api/forum/posts/files/${params.uuid}/download`, {
  89. method: 'POST',
  90. headers: {
  91. 'Accept': 'application/json',
  92. 'Content-Type': 'application/json'
  93. }
  94. });
  95. }