reward.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. 'use server';
  2. // D3 보상/레벨/응원/지위아이템 서버 사이드 API (SSR / Server Action)
  3. // Backend Web.Api/Endpoints/{Rewards/Today, Member/Level, Member/*, Forum/PostCheer/*}.cs 대응.
  4. import { ResultDto } from '@/types/response/common';
  5. import {
  6. MemberLevelResponse,
  7. RewardsTodayResponse,
  8. CheerListResponse,
  9. MemberItemsResponse,
  10. EquippedItemsResponse
  11. } from '@/types/reward';
  12. import { fetchJson } from '@/lib/utils/server';
  13. const JSON_HEADERS = { 'Accept': 'application/json' } as const;
  14. // 내 레벨 요약 (JWT) — GET /api/members/me/level
  15. export async function fetchMyLevel(): Promise<ResultDto<MemberLevelResponse>>
  16. {
  17. return await fetchJson<MemberLevelResponse>('/api/members/me/level', {
  18. method: 'GET',
  19. headers: JSON_HEADERS
  20. });
  21. }
  22. // 오늘 획득 보상 + 캡 잔여 (JWT) — GET /api/rewards/me/today
  23. export async function fetchRewardsToday(): Promise<ResultDto<RewardsTodayResponse>>
  24. {
  25. return await fetchJson<RewardsTodayResponse>('/api/rewards/me/today', {
  26. method: 'GET',
  27. headers: JSON_HEADERS
  28. });
  29. }
  30. // 글 응원 합계 + 최근 N건 (익명) — GET /api/posts/{postID}/cheers?take=
  31. export async function fetchPostCheers(postID: number, take = 20): Promise<ResultDto<CheerListResponse>>
  32. {
  33. return await fetchJson<CheerListResponse>(`/api/posts/${postID}/cheers?take=${take}`, {
  34. method: 'GET',
  35. headers: JSON_HEADERS
  36. });
  37. }
  38. // 내 지위 아이템 보관함 (JWT) — GET /api/members/me/items
  39. export async function fetchMyStatusItems(params: { includeExpired?: boolean; page?: number; perPage?: number } = {}): Promise<ResultDto<MemberItemsResponse>>
  40. {
  41. const queryParams = new URLSearchParams();
  42. queryParams.set('page', String(params.page ?? 1));
  43. queryParams.set('perPage', String(params.perPage ?? 50));
  44. if (params.includeExpired) {
  45. queryParams.set('includeExpired', 'true');
  46. }
  47. return await fetchJson<MemberItemsResponse>(`/api/members/me/items?${queryParams.toString()}`, {
  48. method: 'GET',
  49. headers: JSON_HEADERS
  50. });
  51. }
  52. // 장착 지위 아이템 배치 조회 (익명) — GET /api/members/equipped-items?ids=1,2,3
  53. export async function fetchEquippedItems(memberIDs: number[]): Promise<ResultDto<EquippedItemsResponse>>
  54. {
  55. const ids = memberIDs.filter(id => id > 0).join(',');
  56. return await fetchJson<EquippedItemsResponse>(`/api/members/equipped-items?ids=${ids}`, {
  57. method: 'GET',
  58. headers: JSON_HEADERS
  59. });
  60. }