Skip to content

Commit

Permalink
Merge pull request #57 from academic-relations/56-impl-post-apis-for-…
Browse files Browse the repository at this point in the history
…filling-dbs

56 impl post apis for filling dbs
  • Loading branch information
Gerbera3090 authored Nov 25, 2024
2 parents eb515c4 + 08e87ac commit 1b61898
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import { Controller, Get, Param, UsePipes } from "@nestjs/common";
import { Body, Controller, Get, Param, Post, UsePipes } from "@nestjs/common";

import { ZodPipe } from "@sparcs-students/api/common/pipes/zod-pipe";
import {
ApiOrg001ResponseOK,
ApiOrg001RequestUrl,
apiOrg001,
ApiOrg001RequestParam,
ApiOrg002RequestUrl,
apiOrg002,
ApiOrg002RequestBody,
ApiOrg002ResponseOK,
} from "@sparcs-students/interface/api/organization/index";

import { OrganizationService } from "../service/organization.service";
Expand All @@ -21,4 +25,13 @@ export class OrganizationController {
): Promise<ApiOrg001ResponseOK> {
return this.organizationService.getOrganizationsBySemesterId(param);
}

@Post(ApiOrg002RequestUrl)
@UsePipes(new ZodPipe(apiOrg002))
async postOrganization(
@Body() body: ApiOrg002RequestBody,
): Promise<ApiOrg002ResponseOK> {
const res = await this.organizationService.postOrganization(body);
return res;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Injectable, Inject } from "@nestjs/common";
import { ApiOrg002RequestBody } from "@sparcs-students/interface/api/organization/index";
import { and, or, lte, gte, eq, isNull } from "drizzle-orm";
import { MySql2Database } from "drizzle-orm/mysql2";
import { DrizzleAsyncProvider } from "src/drizzle/drizzle.provider";
Expand Down Expand Up @@ -108,4 +109,43 @@ export class OrganizationRepository {
organizationTypeEnum: row.organization_type_enum,
}));
}

async ckOrganizationBeforeCreate(
body: ApiOrg002RequestBody,
): Promise<number> {
const select = await this.db
.select()
.from(Organization)
.where(
and(
eq(Organization.name, body.name),
eq(Organization.nameEng, body.nameEng),
eq(Organization.organizationTypeEnumId, body.organizationTypeId),
eq(Organization.foundingYear, body.foundingYear),
eq(Organization.startTerm, body.startTerm),
),
)
.limit(1);
if (select.length === 0) {
return 0;
}
return select[0].id;
}

async createOrganization(body: ApiOrg002RequestBody): Promise<number> {
await this.db
.insert(Organization)
.values({
name: body.name,
nameEng: body.nameEng,
organizationTypeEnumId: body.organizationTypeId,
foundingYear: body.foundingYear,
startTerm: body.startTerm,
endTerm: body.endTerm ? body.endTerm : null,
})
.execute();

const res = await this.ckOrganizationBeforeCreate(body);
return res;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Injectable } from "@nestjs/common";
import { HttpException, HttpStatus, Injectable } from "@nestjs/common";

import {
ApiOrg001RequestParam,
ApiOrg001ResponseOK,
ApiOrg002RequestBody,
ApiOrg002ResponseOK,
} from "@sparcs-students/interface/api/organization/index";

import { SemesterPublicService } from "src/feature/semester/semester.public.service";
Expand Down Expand Up @@ -55,4 +57,27 @@ export class OrganizationService {

return { organizationTypes };
}

async postOrganization(
body: ApiOrg002RequestBody,
): Promise<ApiOrg002ResponseOK> {
const ck =
await this.organizationRepository.ckOrganizationBeforeCreate(body);
if (ck > 0) {
throw new HttpException(
"Organization already exists",
HttpStatus.BAD_REQUEST,
);
}
const organizationId =
await this.organizationRepository.createOrganization(body);
if (organizationId < 1) {
throw new HttpException(
"Failed to create organization",
HttpStatus.INTERNAL_SERVER_ERROR,
);
}

return { organizationId };
}
}
64 changes: 64 additions & 0 deletions packages/interface/src/api/organization/endpoint/apiOrg002.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { HttpStatusCode } from "axios";
import { z } from "zod";

import {
zOrgName,
zOrgNameEng,
} from "@sparcs-students/interface/common/stringLength";
import { OrganizationTypeE } from "@sparcs-students/interface/common/enum";
import { zId } from "@sparcs-students/interface/common/type/ids";

/**
* @version v0.1
* @description 총학생회장 권한으로 새로운 단체를 생성합니다.
*/

const url = () => `/uapresident/organizations/organization`;
const method = "POST";

const requestParam = z.object({});

const requestQuery = z.object({});

const requestBody = z.object({
name: zOrgName,
nameEng: zOrgNameEng,
organizationTypeId: z.nativeEnum(OrganizationTypeE),
foundingYear: z.coerce.number().int(),
startTerm: z.coerce.date(),
endTerm: z.coerce.date().optional(),
});

const responseBodyMap = {
[HttpStatusCode.Ok]: z.object({
organizationId: zId,
}),
};

const responseErrorMap = {};

const apiOrg002 = {
url,
method,
requestParam,
requestQuery,
requestBody,
responseBodyMap,
responseErrorMap,
};

type ApiOrg002RequestParam = z.infer<typeof apiOrg002.requestParam>;
type ApiOrg002RequestQuery = z.infer<typeof apiOrg002.requestQuery>;
type ApiOrg002RequestBody = z.infer<typeof apiOrg002.requestBody>;
type ApiOrg002ResponseOK = z.infer<(typeof apiOrg002.responseBodyMap)[200]>;

export default apiOrg002;

export const ApiOrg002RequestUrl = "/uapresident/organizations/organization";

export type {
ApiOrg002RequestParam,
ApiOrg002RequestQuery,
ApiOrg002RequestBody,
ApiOrg002ResponseOK,
};
3 changes: 3 additions & 0 deletions packages/interface/src/api/organization/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
export * from "./endpoint/apiOrg001";
export { default as apiOrg001 } from "./endpoint/apiOrg001"; // default export 추가

export * from "./endpoint/apiOrg002";
export { default as apiOrg002 } from "./endpoint/apiOrg002"; // default export 추가

0 comments on commit 1b61898

Please sign in to comment.