diff --git a/packages/api/src/feature/activity/controller/activity.controller.ts b/packages/api/src/feature/activity/controller/activity.controller.ts index a02a3e4fe..6ad996349 100644 --- a/packages/api/src/feature/activity/controller/activity.controller.ts +++ b/packages/api/src/feature/activity/controller/activity.controller.ts @@ -42,6 +42,16 @@ import apiAct020, { ApiAct020RequestBody, ApiAct020ResponseCreated, } from "@sparcs-clubs/interface/api/activity/endpoint/apiAct020"; +import apiAct021, { + type ApiAct021RequestQuery, + ApiAct021RequestUrl, + type ApiAct021ResponseOk, +} from "@sparcs-clubs/interface/api/activity/endpoint/apiAct021"; +import apiAct022, { + ApiAct022RequestParam, + ApiAct022RequestUrl, + type ApiAct022ResponseOk, +} from "@sparcs-clubs/interface/api/activity/endpoint/apiAct022"; import apiAct023 from "@sparcs-clubs/interface/api/activity/endpoint/apiAct023"; import apiAct024 from "@sparcs-clubs/interface/api/activity/endpoint/apiAct024"; import apiAct025 from "@sparcs-clubs/interface/api/activity/endpoint/apiAct025"; @@ -470,4 +480,27 @@ export default class ActivityController { ); return result; } + + @Student() + @Get(ApiAct021RequestUrl) + @UsePipes(new ZodPipe(apiAct021)) + async getStudentActivitiesAvailable( + @GetStudent() user: GetStudent, + @Query() query: ApiAct021RequestQuery, + ): Promise { + return this.activityService.getStudentActivitiesAvailable( + query.clubId, + user.studentId, + ); + } + + @Student() + @Get(ApiAct022RequestUrl) + @UsePipes(new ZodPipe(apiAct022)) + async getStudentActivityParticipants( + @GetStudent() user: GetStudent, + @Param() param: ApiAct022RequestParam, + ): Promise { + return this.activityService.getStudentActivityParticipants(param.id); + } } diff --git a/packages/api/src/feature/activity/model/activity.duration.model.ts b/packages/api/src/feature/activity/model/activity.duration.model.ts new file mode 100644 index 000000000..b4d1fc940 --- /dev/null +++ b/packages/api/src/feature/activity/model/activity.duration.model.ts @@ -0,0 +1,21 @@ +import { IActivityDuration } from "@sparcs-clubs/interface/api/activity/type/activity.duration.type"; + +export class MActivityDuration implements IActivityDuration { + id: number; + + year: number; + + name: string; + + startTerm: Date; + + endTerm: Date; + + createdAt: Date; + + deletedAt: Date | null; + + constructor(data: IActivityDuration) { + Object.assign(this, data); + } +} diff --git a/packages/api/src/feature/activity/service/activity.public.service.ts b/packages/api/src/feature/activity/service/activity.public.service.ts index 674b01cd6..af901bf11 100644 --- a/packages/api/src/feature/activity/service/activity.public.service.ts +++ b/packages/api/src/feature/activity/service/activity.public.service.ts @@ -1,24 +1,17 @@ import { Injectable, NotFoundException } from "@nestjs/common"; -import { - IActivityD, - IActivitySummary, -} from "@sparcs-clubs/interface/api/activity/type/activity.type"; -import { IStudentSummary } from "@sparcs-clubs/interface/api/user/type/user.type"; +import { IActivityDuration } from "@sparcs-clubs/interface/api/activity/type/activity.duration.type"; +import { IActivitySummary } from "@sparcs-clubs/interface/api/activity/type/activity.type"; -import UserPublicService from "@sparcs-clubs/api/feature/user/service/user.public.service"; +import { getKSTDate } from "@sparcs-clubs/api/common/util/util"; import ActivityActivityTermRepository from "../repository/activity.activity-term.repository"; import ActivityRepository from "../repository/activity.repository"; -import ActivityService from "./activity.service"; - @Injectable() export default class ActivityPublicService { constructor( private activityRepository: ActivityRepository, - private activityService: ActivityService, - private userPublicService: UserPublicService, private activityActivityTermRepository: ActivityActivityTermRepository, ) {} @@ -38,35 +31,23 @@ export default class ActivityPublicService { return this.activityRepository.fetchSummaries(activityIds); } - // API Fnd 007 - async fetchAvailableSummaries(clubId: number): Promise; - async fetchAvailableSummaries( - clubId: number, - activityDId: number, - ): Promise; - async fetchAvailableSummaries( - arg1: number, - arg2?: number, - ): Promise { - if (arg2 === undefined) { - const activityDId = (await this.activityService.getLastActivityD()).id; - return this.activityRepository.fetchAvailableSummaries(arg1, activityDId); + async fetchLastActivityD(): Promise; + async fetchLastActivityD(date: Date): Promise; + async fetchLastActivityD(arg1?: Date): Promise { + if (arg1 === undefined) { + const date = getKSTDate(); + const result = + await this.activityActivityTermRepository.selectLastActivityDByDate( + date, + ); + if (result.length === 0) { + throw new NotFoundException("No such activityD"); + } + return result[0]; } - return this.activityRepository.fetchAvailableSummaries(arg1, arg2); - } - - // API Fnd 008 - async fetchParticipantSummaries( - activityId: number, - ): Promise { - const participantIds = - await this.activityRepository.fetchParticipantIds(activityId); - return this.userPublicService.fetchStudentSummaries(participantIds); - } - async fetchLastActivityD(date: Date): Promise { const result = - await this.activityActivityTermRepository.selectLastActivityDByDate(date); + await this.activityActivityTermRepository.selectLastActivityDByDate(arg1); if (result.length === 0) { throw new NotFoundException("No such activityD"); } diff --git a/packages/api/src/feature/activity/service/activity.service.ts b/packages/api/src/feature/activity/service/activity.service.ts index 1cd41c77a..e1138bb8f 100644 --- a/packages/api/src/feature/activity/service/activity.service.ts +++ b/packages/api/src/feature/activity/service/activity.service.ts @@ -1,5 +1,7 @@ import { HttpException, HttpStatus, Injectable } from "@nestjs/common"; +import { ApiAct021ResponseOk } from "@sparcs-clubs/interface/api/activity/endpoint/apiAct021"; +import { ApiAct022ResponseOk } from "@sparcs-clubs/interface/api/activity/endpoint/apiAct022"; import { ActivityDeadlineEnum, ActivityStatusEnum, @@ -10,7 +12,6 @@ import logger from "@sparcs-clubs/api/common/util/logger"; import { getKSTDate } from "@sparcs-clubs/api/common/util/util"; import ClubTRepository from "@sparcs-clubs/api/feature/club/repository/club.club-t.repository"; import ClubPublicService from "@sparcs-clubs/api/feature/club/service/club.public.service"; -import DivisionPublicService from "@sparcs-clubs/api/feature/division/service/division.public.service"; import FilePublicService from "@sparcs-clubs/api/feature/file/service/file.public.service"; import { ClubRegistrationPublicService } from "@sparcs-clubs/api/feature/registration/club-registration/service/club-registration.public.service"; import UserPublicService from "@sparcs-clubs/api/feature/user/service/user.public.service"; @@ -83,7 +84,6 @@ export default class ActivityService { private activityClubChargedExecutiveRepository: ActivityClubChargedExecutiveRepository, private activityActivityTermRepository: ActivityActivityTermRepository, private clubPublicService: ClubPublicService, - private divisionPublicService: DivisionPublicService, private filePublicService: FilePublicService, private clubRegistrationPublicService: ClubRegistrationPublicService, private clubTRepository: ClubTRepository, @@ -1357,4 +1357,40 @@ export default class ActivityService { executives: executives.filter(e => !clubMemberUserIds.includes(e.userId)), }; } + + async getStudentActivitiesAvailable( + studentId: number, + clubId: number, + ): Promise { + const [isStudentDelegate] = await Promise.all([ + this.clubPublicService.isStudentDelegate(studentId, clubId), + ]); + if (!isStudentDelegate) { + throw new HttpException( + `Student ${studentId} is not the delegate of Club ${clubId}`, + HttpStatus.FORBIDDEN, + ); + } + + const activityDId = (await this.getLastActivityD()).id; + const activities = await this.activityRepository.fetchAvailableSummaries( + clubId, + activityDId, + ); + + return { + activities, + }; + } + + async getStudentActivityParticipants( + activityId: number, + ): Promise { + const participantIds = + await this.activityRepository.fetchParticipantIds(activityId); + return { + participants: + await this.userPublicService.fetchStudentSummaries(participantIds), + }; + } } diff --git a/packages/api/src/feature/funding/controller/funding.controller.ts b/packages/api/src/feature/funding/controller/funding.controller.ts index 357f07c3e..aaef04c85 100644 --- a/packages/api/src/feature/funding/controller/funding.controller.ts +++ b/packages/api/src/feature/funding/controller/funding.controller.ts @@ -12,47 +12,43 @@ import { import apiFnd001, { ApiFnd001RequestBody, ApiFnd001ResponseCreated, -} from "@sparcs-clubs/interface/api/funding/apiFnd001"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd001"; import apiFnd002, { ApiFnd002RequestParam, ApiFnd002ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd002"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd002"; import apiFnd003, { ApiFnd003RequestBody, ApiFnd003RequestParam, ApiFnd003ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd003"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd003"; import apiFnd004, { ApiFnd004RequestParam, ApiFnd004ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd004"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd004"; import apiFnd005, { ApiFnd005RequestQuery, ApiFnd005ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd005"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd005"; import apiFnd006, { ApiFnd006RequestBody, ApiFnd006RequestParam, ApiFnd006ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd006"; -import apiFnd007, { - ApiFnd007RequestQuery, - ApiFnd007RequestUrl, - ApiFnd007ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd007"; -import apiFnd008, { - ApiFnd008RequestQuery, - ApiFnd008RequestUrl, - ApiFnd008ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd008"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd006"; +import apiFnd007 from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd007"; import { ZodPipe } from "@sparcs-clubs/api/common/pipe/zod-pipe"; -import { Student } from "@sparcs-clubs/api/common/util/decorators/method-decorator"; +import { + Public, + Student, +} from "@sparcs-clubs/api/common/util/decorators/method-decorator"; import { GetStudent } from "@sparcs-clubs/api/common/util/decorators/param-decorator"; import FundingService from "../service/funding.service"; +import type { ApiFnd007ResponseOk } from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd007"; + @Controller() export default class FundingController { constructor(private fundingService: FundingService) {} @@ -130,28 +126,10 @@ export default class FundingController { ); } - @Student() - @Get(ApiFnd007RequestUrl) + @Public() + @Get("/public/fundings/deadline") @UsePipes(new ZodPipe(apiFnd007)) - async getStudentFundingActivity( - @GetStudent() user: GetStudent, - @Query() query: ApiFnd007RequestQuery, - ): Promise { - return this.fundingService.getStudentFundingActivity( - user.studentId, - query.clubId, - ); - } - - @Student() - @Get(ApiFnd008RequestUrl) - @UsePipes(new ZodPipe(apiFnd008)) - async getStudentFundingActivityParticipants( - @GetStudent() user: GetStudent, - @Query() query: ApiFnd008RequestQuery, - ): Promise { - return this.fundingService.getStudentFundingActivityParticipants( - query.activityId, - ); + async getPublicFundingsDeadline(): Promise { + return this.fundingService.getPublicFundingsDeadline(); } } diff --git a/packages/api/src/feature/funding/funding.module.ts b/packages/api/src/feature/funding/funding.module.ts index fbfeb8e12..8c86f4f71 100644 --- a/packages/api/src/feature/funding/funding.module.ts +++ b/packages/api/src/feature/funding/funding.module.ts @@ -9,13 +9,19 @@ import UserModule from "../user/user.module"; import FundingController from "./controller/funding.controller"; import FundingCommentRepository from "./repository/funding.comment.repository"; +import FundingDeadlineRepository from "./repository/funding.deadline.repository"; import FundingRepository from "./repository/funding.repository"; import FundingService from "./service/funding.service"; @Module({ imports: [DrizzleModule, UserModule, ClubModule, ActivityModule, FileModule], controllers: [FundingController], - providers: [FundingRepository, FundingService, FundingCommentRepository], + providers: [ + FundingRepository, + FundingService, + FundingCommentRepository, + FundingDeadlineRepository, + ], exports: [], }) export default class FundingModule {} diff --git a/packages/api/src/feature/funding/model/funding.comment.ts b/packages/api/src/feature/funding/model/funding.comment.model.ts similarity index 100% rename from packages/api/src/feature/funding/model/funding.comment.ts rename to packages/api/src/feature/funding/model/funding.comment.model.ts diff --git a/packages/api/src/feature/funding/model/funding.deadline.model.ts b/packages/api/src/feature/funding/model/funding.deadline.model.ts new file mode 100644 index 000000000..80b82ef28 --- /dev/null +++ b/packages/api/src/feature/funding/model/funding.deadline.model.ts @@ -0,0 +1,20 @@ +import { IFundingDeadline } from "@sparcs-clubs/interface/api/funding/type/funding.deadline.type"; +import { FundingDeadlineEnum } from "@sparcs-clubs/interface/common/enum/funding.enum"; + +export class MFundingDeadline implements IFundingDeadline { + id: number; + + deadlineEnum: FundingDeadlineEnum; + + startDate: Date; + + endDate: Date; + + createdAt: Date; + + deletedAt: Date | null; + + constructor(data: IFundingDeadline) { + Object.assign(this, data); + } +} diff --git a/packages/api/src/feature/funding/repository/funding.comment.repository.ts b/packages/api/src/feature/funding/repository/funding.comment.repository.ts index f54931b80..dd405762e 100644 --- a/packages/api/src/feature/funding/repository/funding.comment.repository.ts +++ b/packages/api/src/feature/funding/repository/funding.comment.repository.ts @@ -4,7 +4,7 @@ import { MySql2Database } from "drizzle-orm/mysql2"; import { DrizzleAsyncProvider } from "@sparcs-clubs/api/drizzle/drizzle.provider"; import { FundingFeedback } from "@sparcs-clubs/api/drizzle/schema/funding.schema"; -import { MFundingComment } from "@sparcs-clubs/api/feature/funding/model/funding.comment"; +import { MFundingComment } from "@sparcs-clubs/api/feature/funding/model/funding.comment.model"; @Injectable() export default class FundingCommentRepository { diff --git a/packages/api/src/feature/funding/repository/funding.deadline.repository.ts b/packages/api/src/feature/funding/repository/funding.deadline.repository.ts new file mode 100644 index 000000000..5f7cfd210 --- /dev/null +++ b/packages/api/src/feature/funding/repository/funding.deadline.repository.ts @@ -0,0 +1,36 @@ +import { Inject, Injectable, NotFoundException } from "@nestjs/common"; +import { and, gt, isNull, lte } from "drizzle-orm"; +import { MySql2Database } from "drizzle-orm/mysql2"; + +import { DrizzleAsyncProvider } from "@sparcs-clubs/api/drizzle/drizzle.provider"; +import { FundingDeadlineD } from "@sparcs-clubs/api/drizzle/schema/funding.schema"; + +import { MFundingDeadline } from "../model/funding.deadline.model"; + +@Injectable() +export default class FundingDeadlineRepository { + constructor(@Inject(DrizzleAsyncProvider) private db: MySql2Database) {} + + /** + * @param date 날짜를 받습니다. + * @returns 해당 날짜가 포함된 자금 지원 신청 마감 기한 정보를 리턴합니다. + */ + async fetch(date: Date): Promise { + const result = await this.db + .select() + .from(FundingDeadlineD) + .where( + and( + lte(FundingDeadlineD.startDate, date), + gt(FundingDeadlineD.endDate, date), + isNull(FundingDeadlineD.deletedAt), + ), + ); + + if (result.length === 0) { + throw new NotFoundException("Funding deadline not found"); + } + + return result[0]; + } +} diff --git a/packages/api/src/feature/funding/service/funding.service.ts b/packages/api/src/feature/funding/service/funding.service.ts index 7ccbac1a6..71264c3c4 100644 --- a/packages/api/src/feature/funding/service/funding.service.ts +++ b/packages/api/src/feature/funding/service/funding.service.ts @@ -3,31 +3,30 @@ import { HttpException, HttpStatus, Injectable } from "@nestjs/common"; import { ApiFnd001RequestBody, ApiFnd001ResponseCreated, -} from "@sparcs-clubs/interface/api/funding/apiFnd001"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd001"; import { ApiFnd002RequestParam, ApiFnd002ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd002"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd002"; import { ApiFnd003RequestBody, ApiFnd003RequestParam, ApiFnd003ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd003"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd003"; import { ApiFnd004RequestParam, ApiFnd004ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd004"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd004"; import { ApiFnd005RequestQuery, ApiFnd005ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd005"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd005"; import { ApiFnd006RequestBody, ApiFnd006RequestParam, ApiFnd006ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd006"; -import { ApiFnd007ResponseOk } from "@sparcs-clubs/interface/api/funding/apiFnd007"; -import { ApiFnd008ResponseOk } from "@sparcs-clubs/interface/api/funding/apiFnd008"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd006"; +import { ApiFnd007ResponseOk } from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd007"; import { IFundingCommentResponse, @@ -41,6 +40,7 @@ import FilePublicService from "@sparcs-clubs/api/feature/file/service/file.publi import UserPublicService from "@sparcs-clubs/api/feature/user/service/user.public.service"; import FundingCommentRepository from "../repository/funding.comment.repository"; +import FundingDeadlineRepository from "../repository/funding.deadline.repository"; import FundingRepository from "../repository/funding.repository"; @Injectable() @@ -52,6 +52,7 @@ export default class FundingService { private readonly userPublicService: UserPublicService, private readonly clubPublicService: ClubPublicService, private readonly activityPublicService: ActivityPublicService, + private fundingDeadlineRepository: FundingDeadlineRepository, ) {} async postStudentFunding( @@ -346,35 +347,21 @@ export default class FundingService { }; } - async getStudentFundingActivity( - studentId: number, - clubId: number, - ): Promise { - const [isStudentDelegate] = await Promise.all([ - this.clubPublicService.isStudentDelegate(studentId, clubId), - ]); - if (!isStudentDelegate) { - throw new HttpException( - `Student ${studentId} is not the delegate of Club ${clubId}`, - HttpStatus.FORBIDDEN, - ); - } - - const activities = - await this.activityPublicService.fetchAvailableSummaries(clubId); + /** + * @description 지원금 신청의 작성 기한을 확인합니다. + * @returns 현재 시점의 지원금 신청 마감 기한과 대상 활동 기간을 리턴합니다. + */ + async getPublicFundingsDeadline(): Promise { + const today = getKSTDate(); - return { - activities, - }; - } + const [targetDuration, deadline] = await Promise.all([ + this.activityPublicService.fetchLastActivityD(), + this.fundingDeadlineRepository.fetch(today), + ]); - async getStudentFundingActivityParticipants( - activityId: number, - ): Promise { - const participants = - await this.activityPublicService.fetchParticipantSummaries(activityId); return { - participants, + targetDuration, + deadline, }; } } diff --git a/packages/interface/src/api/funding/apiFnd007.ts b/packages/interface/src/api/activity/endpoint/apiAct021.ts similarity index 56% rename from packages/interface/src/api/funding/apiFnd007.ts rename to packages/interface/src/api/activity/endpoint/apiAct021.ts index 6181843f9..21b15d97b 100644 --- a/packages/interface/src/api/funding/apiFnd007.ts +++ b/packages/interface/src/api/activity/endpoint/apiAct021.ts @@ -1,8 +1,9 @@ import { HttpStatusCode } from "axios"; import { z } from "zod"; -import { zActivitySummary } from "../activity/type/activity.type"; -import { zClub } from "../club/type/club.type"; +// eslint-disable-next-line no-restricted-imports +import { zClub } from "../../club/type/club.type"; +import { zActivitySummary } from "../type/activity.type"; /** * @version v0.1 @@ -11,9 +12,9 @@ import { zClub } from "../club/type/club.type"; * 오늘이 지원금 작성 or 수정 기간이어야 합니다. */ -const url = () => "/student/fundings/activities"; +const url = () => "/student/activities/available"; const method = "GET"; -export const ApiFnd007RequestUrl = "/student/fundings/activities"; +export const ApiAct021RequestUrl = "/student/activities/available"; const requestParam = z.object({}); @@ -31,7 +32,7 @@ const responseBodyMap = { const responseErrorMap = {}; -const apiFnd007 = { +const apiAct021 = { url, method, requestParam, @@ -41,16 +42,16 @@ const apiFnd007 = { responseErrorMap, }; -type ApiFnd007RequestParam = z.infer; -type ApiFnd007RequestQuery = z.infer; -type ApiFnd007RequestBody = z.infer; -type ApiFnd007ResponseOk = z.infer<(typeof apiFnd007.responseBodyMap)[200]>; +type ApiAct021RequestParam = z.infer; +type ApiAct021RequestQuery = z.infer; +type ApiAct021RequestBody = z.infer; +type ApiAct021ResponseOk = z.infer<(typeof apiAct021.responseBodyMap)[200]>; -export default apiFnd007; +export default apiAct021; export type { - ApiFnd007RequestBody, - ApiFnd007RequestParam, - ApiFnd007RequestQuery, - ApiFnd007ResponseOk, + ApiAct021RequestBody, + ApiAct021RequestParam, + ApiAct021RequestQuery, + ApiAct021ResponseOk, }; diff --git a/packages/interface/src/api/activity/endpoint/apiAct022.ts b/packages/interface/src/api/activity/endpoint/apiAct022.ts new file mode 100644 index 000000000..6ac3d73f4 --- /dev/null +++ b/packages/interface/src/api/activity/endpoint/apiAct022.ts @@ -0,0 +1,55 @@ +import { HttpStatusCode } from "axios"; +import { z } from "zod"; + +// eslint-disable-next-line no-restricted-imports +import { zStudentSummary } from "../../user/type/user.type"; + +/** + * @version v0.1 + * @description 선택된 학기 활동보고서의 참여 인원을 불러옵니다. + */ + +const url = (id: number) => `/student/activities/activity/${id}/participants`; +const method = "GET"; +export const ApiAct022RequestUrl = + "/student/activities/activity/:id/participants"; + +const requestParam = z.object({ + id: z.coerce.number().int().min(1), +}); + +const requestQuery = z.object({}); + +const requestBody = z.object({}); + +const responseBodyMap = { + [HttpStatusCode.Ok]: z.object({ + participants: z.array(zStudentSummary), + }), +}; + +const responseErrorMap = {}; + +const apiAct022 = { + url, + method, + requestParam, + requestQuery, + requestBody, + responseBodyMap, + responseErrorMap, +}; + +type ApiAct022RequestParam = z.infer; +type ApiAct022RequestQuery = z.infer; +type ApiAct022RequestBody = z.infer; +type ApiAct022ResponseOk = z.infer<(typeof apiAct022.responseBodyMap)[200]>; + +export default apiAct022; + +export type { + ApiAct022RequestBody, + ApiAct022RequestParam, + ApiAct022RequestQuery, + ApiAct022ResponseOk, +}; diff --git a/packages/interface/src/api/activity/type/activity.duration.type.ts b/packages/interface/src/api/activity/type/activity.duration.type.ts new file mode 100644 index 000000000..b3e7ca020 --- /dev/null +++ b/packages/interface/src/api/activity/type/activity.duration.type.ts @@ -0,0 +1,13 @@ +import { z } from "zod"; + +export const zActivityDuration = z.object({ + id: z.coerce.number().int().min(1), + year: z.coerce.number().int().min(1), + name: z.string().max(10).min(1), + startTerm: z.date(), + endTerm: z.date(), + createdAt: z.date(), + deletedAt: z.date().nullable(), +}); + +export type IActivityDuration = z.infer; diff --git a/packages/interface/src/api/funding/apiFnd008.ts b/packages/interface/src/api/funding/apiFnd008.ts deleted file mode 100644 index 352fea638..000000000 --- a/packages/interface/src/api/funding/apiFnd008.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { HttpStatusCode } from "axios"; -import { z } from "zod"; - -import { zActivity } from "../activity/type/activity.type"; -import { zStudentSummary } from "../user/type/user.type"; - -/** - * @version v0.1 - * @description 선택된 학기 활동보고서의 참여 인원을 불러옵니다. - */ - -const url = () => "/student/fundings/activities/participants"; -const method = "GET"; -export const ApiFnd008RequestUrl = "/student/fundings/activities/participants"; - -const requestParam = z.object({}); - -const requestQuery = z.object({ - activityId: zActivity.pick({ id: true }).shape.id, // TODO: clubId: zPickElement(zActivitySummary, "id"), -}); - -const requestBody = z.object({}); - -const responseBodyMap = { - [HttpStatusCode.Ok]: z.object({ - participants: z.array(zStudentSummary), - }), -}; - -const responseErrorMap = {}; - -const apiFnd008 = { - url, - method, - requestParam, - requestQuery, - requestBody, - responseBodyMap, - responseErrorMap, -}; - -type ApiFnd008RequestParam = z.infer; -type ApiFnd008RequestQuery = z.infer; -type ApiFnd008RequestBody = z.infer; -type ApiFnd008ResponseOk = z.infer<(typeof apiFnd008.responseBodyMap)[200]>; - -export default apiFnd008; - -export type { - ApiFnd008RequestBody, - ApiFnd008RequestParam, - ApiFnd008RequestQuery, - ApiFnd008ResponseOk, -}; diff --git a/packages/interface/src/api/funding/apiFnd001.ts b/packages/interface/src/api/funding/endpoint/apiFnd001.ts similarity index 94% rename from packages/interface/src/api/funding/apiFnd001.ts rename to packages/interface/src/api/funding/endpoint/apiFnd001.ts index 8e822c87b..627ab5247 100644 --- a/packages/interface/src/api/funding/apiFnd001.ts +++ b/packages/interface/src/api/funding/endpoint/apiFnd001.ts @@ -1,7 +1,7 @@ import { HttpStatusCode } from "axios"; import { z } from "zod"; -import { zFundingRequest } from "./type/funding.type"; +import { zFundingRequest } from "../type/funding.type"; /** * @version v0.1 diff --git a/packages/interface/src/api/funding/apiFnd002.ts b/packages/interface/src/api/funding/endpoint/apiFnd002.ts similarity index 94% rename from packages/interface/src/api/funding/apiFnd002.ts rename to packages/interface/src/api/funding/endpoint/apiFnd002.ts index 53129e53d..70fe205fa 100644 --- a/packages/interface/src/api/funding/apiFnd002.ts +++ b/packages/interface/src/api/funding/endpoint/apiFnd002.ts @@ -1,7 +1,7 @@ import { HttpStatusCode } from "axios"; import { z } from "zod"; -import { zFundingResponse } from "./type/funding.type"; +import { zFundingResponse } from "../type/funding.type"; /** * @version v0.1 diff --git a/packages/interface/src/api/funding/apiFnd003.ts b/packages/interface/src/api/funding/endpoint/apiFnd003.ts similarity index 94% rename from packages/interface/src/api/funding/apiFnd003.ts rename to packages/interface/src/api/funding/endpoint/apiFnd003.ts index c5e9dac2b..3f5d6e644 100644 --- a/packages/interface/src/api/funding/apiFnd003.ts +++ b/packages/interface/src/api/funding/endpoint/apiFnd003.ts @@ -1,7 +1,7 @@ import { HttpStatusCode } from "axios"; import { z } from "zod"; -import { zFundingRequest } from "./type/funding.type"; +import { zFundingRequest } from "../type/funding.type"; /** * @version v0.1 diff --git a/packages/interface/src/api/funding/apiFnd004.ts b/packages/interface/src/api/funding/endpoint/apiFnd004.ts similarity index 100% rename from packages/interface/src/api/funding/apiFnd004.ts rename to packages/interface/src/api/funding/endpoint/apiFnd004.ts diff --git a/packages/interface/src/api/funding/apiFnd005.ts b/packages/interface/src/api/funding/endpoint/apiFnd005.ts similarity index 94% rename from packages/interface/src/api/funding/apiFnd005.ts rename to packages/interface/src/api/funding/endpoint/apiFnd005.ts index c368011b7..cf3898183 100644 --- a/packages/interface/src/api/funding/apiFnd005.ts +++ b/packages/interface/src/api/funding/endpoint/apiFnd005.ts @@ -1,7 +1,7 @@ import { HttpStatusCode } from "axios"; import { z } from "zod"; -import { zFundingResponseSummary } from "./type/funding.type"; +import { zFundingResponseSummary } from "../type/funding.type"; /** * @version v0.1 diff --git a/packages/interface/src/api/funding/apiFnd006.ts b/packages/interface/src/api/funding/endpoint/apiFnd006.ts similarity index 94% rename from packages/interface/src/api/funding/apiFnd006.ts rename to packages/interface/src/api/funding/endpoint/apiFnd006.ts index 4b5c51f55..3c3c22782 100644 --- a/packages/interface/src/api/funding/apiFnd006.ts +++ b/packages/interface/src/api/funding/endpoint/apiFnd006.ts @@ -1,7 +1,7 @@ import { HttpStatusCode } from "axios"; import { z } from "zod"; -import { zFundingResponseSummary } from "./type/funding.type"; +import { zFundingResponseSummary } from "../type/funding.type"; /** * @version v0.1 diff --git a/packages/interface/src/api/funding/endpoint/apiFnd007.ts b/packages/interface/src/api/funding/endpoint/apiFnd007.ts new file mode 100644 index 000000000..bb5bc2f82 --- /dev/null +++ b/packages/interface/src/api/funding/endpoint/apiFnd007.ts @@ -0,0 +1,51 @@ +import { HttpStatusCode } from "axios"; +import { z } from "zod"; + +import { zActivityDuration } from "@sparcs-clubs/interface/api/activity/type/activity.duration.type"; + +import { zFundingDeadline } from "../type/funding.deadline.type"; + +/** + * @version v0.1 + * @description 지원금 신청의 작성 기한을 확인합니다. + */ + +const url = () => `/public/fundings/deadline`; +const method = "GET"; + +const requestParam = z.object({}); +const requestQuery = z.object({}); +const requestBody = z.object({}); + +const responseBodyMap = { + [HttpStatusCode.Ok]: z.object({ + targetDuration: zActivityDuration, + deadline: zFundingDeadline, + }), +}; + +const responseErrorMap = {}; + +const apiFnd007 = { + url, + method, + requestParam, + requestQuery, + requestBody, + responseBodyMap, + responseErrorMap, +}; + +type ApiFnd007RequestParam = z.infer; +type ApiFnd007RequestQuery = z.infer; +type ApiFnd007RequestBody = z.infer; +type ApiFnd007ResponseOk = z.infer<(typeof apiFnd007.responseBodyMap)[200]>; + +export default apiFnd007; + +export type { + ApiFnd007RequestParam, + ApiFnd007RequestQuery, + ApiFnd007RequestBody, + ApiFnd007ResponseOk, +}; diff --git a/packages/interface/src/api/funding/type/funding.deadline.type.ts b/packages/interface/src/api/funding/type/funding.deadline.type.ts new file mode 100644 index 000000000..51bb3a0f5 --- /dev/null +++ b/packages/interface/src/api/funding/type/funding.deadline.type.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; + +import { FundingDeadlineEnum } from "@sparcs-clubs/interface/common/enum/funding.enum"; + +export const zFundingDeadline = z.object({ + id: z.coerce.number().int().min(1), + deadlineEnum: z.nativeEnum(FundingDeadlineEnum), + startDate: z.date(), + endDate: z.date(), + createdAt: z.date(), + deletedAt: z.date().nullable(), +}); + +export type IFundingDeadline = z.infer; diff --git a/packages/interface/src/common/enum/funding.enum.ts b/packages/interface/src/common/enum/funding.enum.ts index e79eb4502..c9bba7696 100644 --- a/packages/interface/src/common/enum/funding.enum.ts +++ b/packages/interface/src/common/enum/funding.enum.ts @@ -6,7 +6,6 @@ export enum FundingStatusEnum { } export enum FundingDeadlineEnum { - Activity = 1, // 활동 Writing, // 작성 Revision, // 수정 Review, // 검토 diff --git a/packages/web/src/features/manage-club/funding/services/useGetFunding.ts b/packages/web/src/features/manage-club/funding/services/useGetFunding.ts index b5a8b6e05..5780575bb 100644 --- a/packages/web/src/features/manage-club/funding/services/useGetFunding.ts +++ b/packages/web/src/features/manage-club/funding/services/useGetFunding.ts @@ -1,6 +1,6 @@ import apiFnd002, { ApiFnd002ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd002"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd002"; import { useQuery } from "@tanstack/react-query"; import { diff --git a/packages/web/src/features/manage-club/funding/services/useGetNewFundingList.ts b/packages/web/src/features/manage-club/funding/services/useGetNewFundingList.ts index 20c1c6030..80f581edc 100644 --- a/packages/web/src/features/manage-club/funding/services/useGetNewFundingList.ts +++ b/packages/web/src/features/manage-club/funding/services/useGetNewFundingList.ts @@ -1,7 +1,7 @@ import apiFnd005, { ApiFnd005RequestQuery, ApiFnd005ResponseOk, -} from "@sparcs-clubs/interface/api/funding/apiFnd005"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd005"; import { useQuery } from "@tanstack/react-query"; import { mockupManageFunding } from "@sparcs-clubs/web/features/manage-club/services/_mock/mockManageClub"; diff --git a/packages/web/src/features/manage-club/funding/services/usePostFunding.ts b/packages/web/src/features/manage-club/funding/services/usePostFunding.ts index 87e16ddd8..dae82e497 100644 --- a/packages/web/src/features/manage-club/funding/services/usePostFunding.ts +++ b/packages/web/src/features/manage-club/funding/services/usePostFunding.ts @@ -1,7 +1,7 @@ import apiFnd001, { ApiFnd001RequestBody, ApiFnd001ResponseCreated, -} from "@sparcs-clubs/interface/api/funding/apiFnd001"; +} from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd001"; import { useMutation } from "@tanstack/react-query"; import { diff --git a/packages/web/src/features/manage-club/funding/services/usePutFunding.ts b/packages/web/src/features/manage-club/funding/services/usePutFunding.ts index 384c303ab..8995f66f6 100644 --- a/packages/web/src/features/manage-club/funding/services/usePutFunding.ts +++ b/packages/web/src/features/manage-club/funding/services/usePutFunding.ts @@ -1,4 +1,4 @@ -import apiFnd003 from "@sparcs-clubs/interface/api/funding/apiFnd003"; +import apiFnd003 from "@sparcs-clubs/interface/api/funding/endpoint/apiFnd003"; import { useMutation } from "@tanstack/react-query"; import { z } from "zod";