Skip to content

Commit

Permalink
Merge pull request #1374 from academic-relations/1372-feat-api-fnd-007
Browse files Browse the repository at this point in the history
1372 feat api fnd 007
  • Loading branch information
pbc1017 authored Jan 23, 2025
2 parents 7a96d76 + 1107069 commit 7c05c26
Show file tree
Hide file tree
Showing 28 changed files with 368 additions and 191 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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<ApiAct021ResponseOk> {
return this.activityService.getStudentActivitiesAvailable(
query.clubId,
user.studentId,
);
}

@Student()
@Get(ApiAct022RequestUrl)
@UsePipes(new ZodPipe(apiAct022))
async getStudentActivityParticipants(
@GetStudent() user: GetStudent,
@Param() param: ApiAct022RequestParam,
): Promise<ApiAct022ResponseOk> {
return this.activityService.getStudentActivityParticipants(param.id);
}
}
21 changes: 21 additions & 0 deletions packages/api/src/feature/activity/model/activity.duration.model.ts
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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,
) {}

Expand All @@ -38,35 +31,23 @@ export default class ActivityPublicService {
return this.activityRepository.fetchSummaries(activityIds);
}

// API Fnd 007
async fetchAvailableSummaries(clubId: number): Promise<IActivitySummary[]>;
async fetchAvailableSummaries(
clubId: number,
activityDId: number,
): Promise<IActivitySummary[]>;
async fetchAvailableSummaries(
arg1: number,
arg2?: number,
): Promise<IActivitySummary[]> {
if (arg2 === undefined) {
const activityDId = (await this.activityService.getLastActivityD()).id;
return this.activityRepository.fetchAvailableSummaries(arg1, activityDId);
async fetchLastActivityD(): Promise<IActivityDuration>;
async fetchLastActivityD(date: Date): Promise<IActivityDuration>;
async fetchLastActivityD(arg1?: Date): Promise<IActivityDuration> {
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<IStudentSummary[]> {
const participantIds =
await this.activityRepository.fetchParticipantIds(activityId);
return this.userPublicService.fetchStudentSummaries(participantIds);
}

async fetchLastActivityD(date: Date): Promise<IActivityD> {
const result =
await this.activityActivityTermRepository.selectLastActivityDByDate(date);
await this.activityActivityTermRepository.selectLastActivityDByDate(arg1);
if (result.length === 0) {
throw new NotFoundException("No such activityD");
}
Expand Down
40 changes: 38 additions & 2 deletions packages/api/src/feature/activity/service/activity.service.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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";
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -1357,4 +1357,40 @@ export default class ActivityService {
executives: executives.filter(e => !clubMemberUserIds.includes(e.userId)),
};
}

async getStudentActivitiesAvailable(
studentId: number,
clubId: number,
): Promise<ApiAct021ResponseOk> {
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<ApiAct022ResponseOk> {
const participantIds =
await this.activityRepository.fetchParticipantIds(activityId);
return {
participants:
await this.userPublicService.fetchStudentSummaries(participantIds),
};
}
}
56 changes: 17 additions & 39 deletions packages/api/src/feature/funding/controller/funding.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand Down Expand Up @@ -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<ApiFnd007ResponseOk> {
return this.fundingService.getStudentFundingActivity(
user.studentId,
query.clubId,
);
}

@Student()
@Get(ApiFnd008RequestUrl)
@UsePipes(new ZodPipe(apiFnd008))
async getStudentFundingActivityParticipants(
@GetStudent() user: GetStudent,
@Query() query: ApiFnd008RequestQuery,
): Promise<ApiFnd008ResponseOk> {
return this.fundingService.getStudentFundingActivityParticipants(
query.activityId,
);
async getPublicFundingsDeadline(): Promise<ApiFnd007ResponseOk> {
return this.fundingService.getPublicFundingsDeadline();
}
}
8 changes: 7 additions & 1 deletion packages/api/src/feature/funding/funding.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}
20 changes: 20 additions & 0 deletions packages/api/src/feature/funding/model/funding.deadline.model.ts
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<MFundingDeadline> {
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];
}
}
Loading

0 comments on commit 7c05c26

Please sign in to comment.