From 040f2531b389d284abe21dd32fdd465c9033aaf4 Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Thu, 30 Sep 2021 22:12:05 +0900 Subject: [PATCH 01/10] refactor : middleware convert to decorator --- serverless.yml | 8 +- src/DTO/middleware.ts | 2 +- src/middleware/auth.ts | 106 ++++---- src/routes/post/index.ts | 527 +++++++++++++++++++-------------------- 4 files changed, 321 insertions(+), 322 deletions(-) diff --git a/serverless.yml b/serverless.yml index aafdbc0..a52baff 100644 --- a/serverless.yml +++ b/serverless.yml @@ -33,7 +33,7 @@ resources: functions: getKindOfAlgorithemCount: - handler: src/handler.getAlgorithemCountAtAll + handler: src/handler.getStatusList events: - http: path: post/count @@ -54,21 +54,21 @@ functions: method: get cors: true createAlgorithem: - handler: src/handler.wirteAlogorithem + handler: src/handler.postAlgorithem events: - http: path: post/create method: post cors: true changeStatusAlgorithem: - handler: src/handler.setAlogorithemStatus + handler: src/handler.setAlgorithemStatus events: - http: path: post/{id}/setStatus method: post cors: true modifyAlgorithem: - handler: src/handler.modifyAlogirithemContent + handler: src/handler.modifyAlgorithem events: - http: path: post/{id}/modify diff --git a/src/DTO/middleware.ts b/src/DTO/middleware.ts index cbda90f..fb90edd 100644 --- a/src/DTO/middleware.ts +++ b/src/DTO/middleware.ts @@ -1,3 +1,3 @@ import { APIGatewayEvent } from "aws-lambda"; -export type certifiedEvent = APIGatewayEvent & { state?: { isAdmin: boolean } }; +export type CertifiedEvent = APIGatewayEvent & { state?: { isAdmin: boolean } }; diff --git a/src/middleware/auth.ts b/src/middleware/auth.ts index ccf62d7..7019cae 100644 --- a/src/middleware/auth.ts +++ b/src/middleware/auth.ts @@ -1,66 +1,68 @@ import { APIGatewayEvent } from "aws-lambda"; import { verify } from "jsonwebtoken"; import { MiddlewareDTO } from "../DTO"; -import { ReturnResHTTPData } from "../DTO/http"; import { ALLOWED_ORIGINS, createErrorRes } from "../util/serverless"; -// add state.isAdmin for authorized user -export function authMiddleware({ - continuous, -}: { - continuous: boolean; -}): ( - event: APIGatewayEvent, - next: (event: MiddlewareDTO.certifiedEvent) => Promise -) => Promise { - return async ( - event: APIGatewayEvent, - next: (event: MiddlewareDTO.certifiedEvent) => Promise - ): Promise => { - // don't have authorization header - const origin = event.headers.origin; - if (!ALLOWED_ORIGINS.includes(origin) && origin) { - return createErrorRes({ - status: 401, - message: "인증되지않은 오리진입니다.", - }); - } - if (event.headers.Authorization == null) { - if (continuous) { - const newEvent = Object.assign({}, event, { - state: { isAdmin: false }, - }); - return await next(newEvent); - } else { +export class AuthMiddleware { + static onlyOrigin(_: any, __: string, desc: PropertyDescriptor) { + const originMethod = desc.value; + desc.value = function (...args: any[]) { + const req: APIGatewayEvent = args[0]; + const origin = req.headers.origin; + if (!ALLOWED_ORIGINS.includes(origin) && origin) { return createErrorRes({ status: 401, - message: "인증되지 않은 유저입니다.\n", + message: "인증되지않은 오리진입니다.", }); } - } + return originMethod.apply(this, args); + }; + } + + // add state.isAdmin for authorized user + static admin(continuous: boolean = true) { + return function (_: any, __: string, desc: PropertyDescriptor) { + const originMethod = desc.value; + desc.value = function (...args: any[]) { + const req: APIGatewayEvent = args[0]; + if (req.headers.Authorization == null) { + if (continuous) { + const newReq = Object.assign({}, req, { + state: { isAdmin: false }, + }); + return originMethod.apply(this, [newReq, args[1], args[2]]); + } else { + return createErrorRes({ + status: 401, + message: "인증되지 않은 유저입니다.\n", + }); + } + } - let newEvent: MiddlewareDTO.certifiedEvent = event; + let newReq: MiddlewareDTO.CertifiedEvent = req; - // distinguish authorized user - try { - verify(event.headers.Authorization, process.env.JWT_SECRET ?? "secure"); - newEvent = Object.assign({}, event, { - state: { isAdmin: true }, - }); - } catch (err) { - newEvent = Object.assign({}, event, { - state: { isAdmin: false }, - }); - } + // distinguish authorized user + try { + verify(req.headers.Authorization, process.env.JWT_SECRET ?? "secure"); + newReq = Object.assign({}, req, { + state: { isAdmin: true }, + }); + } catch (err) { + newReq = Object.assign({}, req, { + state: { isAdmin: false }, + }); + } - if (!newEvent.state.isAdmin && !continuous) { - // return 401 HTTP error - return createErrorRes({ - status: 401, - message: "인증되지 않은 유저입니다.", - }); - } + if (!newReq.state.isAdmin && !continuous) { + // return 401 HTTP error + return createErrorRes({ + status: 401, + message: "인증되지 않은 유저입니다.", + }); + } - return await next(newEvent); - }; + return originMethod.apply(this, [newReq, args[1], args[2]]); + }; + }; + } } diff --git a/src/routes/post/index.ts b/src/routes/post/index.ts index 232f4a3..34a2018 100644 --- a/src/routes/post/index.ts +++ b/src/routes/post/index.ts @@ -4,310 +4,307 @@ import * as mongoose from "mongoose"; import { MiddlewareDTO, AlgorithemDTO } from "../../DTO"; import { ReturnResHTTPData } from "../../DTO/http"; -import { authMiddleware } from "../../middleware/auth"; +import { AuthMiddleware } from "../../middleware/auth"; import Post from "../../model/posts"; import verifieres from "../../model/verifieres"; import { AlgorithemService } from "../../service"; import { connectOptions } from "../../util/mongodb"; import { createRes, createErrorRes } from "../../util/serverless"; -export const getAlgorithemCountAtAll: Function = async ( - _: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); +class Algorithem { + static async getAlgorithemCountAtAll( + _: APIGatewayEvent, + __: any, + ___: Function + ): Promise { + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) + ); - // get Number of algorithms by type - const body: AlgorithemDTO.StatusCountList = - await AlgorithemService.getKindOfAlgorithemCount(); - const returnValue = createRes({ body }); - return returnValue; -}; + // get Number of algorithms by type + const body: AlgorithemDTO.StatusCountList = + await AlgorithemService.getKindOfAlgorithemCount(); + const returnValue = createRes({ body }); + return returnValue; + } -export const getAlgorithemList: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - // use middleware for authorized user - return await authMiddleware({ continuous: true })( - event, - async (event: MiddlewareDTO.certifiedEvent) => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); + @AuthMiddleware.admin() + static async getAlgorithemList( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) + ); - // get parameter - const { count, cursor, status } = event.queryStringParameters; + // get parameter + const { count, cursor, status } = event.queryStringParameters; - //get algorithem list for return body value - const body = await AlgorithemService.getAlgorithemList( - { - count: Number(count || "20"), - cursor: cursor ?? "0", - status: status ?? AlgorithemDTO.PostStatus.Accepted, - }, - event.state.isAdmin - ); - return createRes({ body }); - } - ); -}; + //get algorithem list for return body value + const body = await AlgorithemService.getAlgorithemList( + { + count: Number(count || "20"), + cursor: cursor ?? "0", + status: status ?? AlgorithemDTO.PostStatus.Accepted, + }, + event.state.isAdmin + ); + return createRes({ body }); + } -export const getAlgorithemListAtPages: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { // use middleware for authorized user - return await authMiddleware({ continuous: true })( - event, - async (event: MiddlewareDTO.certifiedEvent) => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); - - // get parameter - const { page, status } = event.queryStringParameters; - if (Number(page) <= 0) - return createErrorRes({ - message: "page값은 1부터 시작합니다.", - }); - //get algorithem list for return body value - const body = await AlgorithemService.getAlgorithemListAtPages( - { - page: Number(page || 1), - status: status ?? AlgorithemDTO.PostStatus.Accepted, - }, - event.state.isAdmin + @AuthMiddleware.admin() + static async getAlgorithemListAtPages( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) ); - return createRes({ body }); - } - ); -}; -// Ability to publish algorithms for those who answered the question -export const wirteAlogorithem: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) + // get parameter + const { page, status } = event.queryStringParameters; + if (Number(page) <= 0) + return createErrorRes({ + message: "page값은 1부터 시작합니다.", + }); + //get algorithem list for return body value + const body = await AlgorithemService.getAlgorithemListAtPages( + { + page: Number(page || 1), + status: status ?? AlgorithemDTO.PostStatus.Accepted, + }, + event.state.isAdmin ); - - // get json type body values - const { title, content, tag, verifier } = JSON.parse(event.body); - - // value check - if (!title || !content || !tag) { - return createErrorRes({ - message: "필숫값이 제대로 전달되지 않았습니다.", - }); + return createRes({ body }); } - // auth answers to questions - const certified = await verifieres - .findOne({ _id: Base64.decode(verifier.id) }) - .exec(); - if (!certified?.isCorrect(verifier.answer)) { - // (don't have verifier) or (have verifier but isNotCorrect answer) - return createErrorRes({ - status: 401, - message: "인증을 실패하였습니다.", - }); - } + // Ability to publish algorithms for those who answered the question + @AuthMiddleware.onlyOrigin + @AuthMiddleware.admin(false) + static async wirteAlogorithem( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) + ); - // post algorithem - const body = await AlgorithemService.postAlgorithem({ - title: title, - content: content, - tag: tag, - }); - return createRes({ body }); -}; + // get json type body values + const { title, content, tag, verifier } = JSON.parse(event.body); -// renew algorithem's status -export const setAlogorithemStatus: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - // use auth middleware for admin - return await authMiddleware({ continuous: false })( - event, - async (event: MiddlewareDTO.certifiedEvent) => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); - try { - //get parameter at body - const { status, reason } = JSON.parse(event.body); + // value check + if (!title || !content || !tag) { + return createErrorRes({ + message: "필숫값이 제대로 전달되지 않았습니다.", + }); + } - //check status value - if (!status) { - return createErrorRes({ - status: 400, - message: - "status값이 선언되지않았습니다.\n다시 값을 확인해주시길 바랍니다.", - }); - } + // auth answers to questions + const certified = await verifieres + .findOne({ _id: Base64.decode(verifier.id) }) + .exec(); + if (!certified?.isCorrect(verifier.answer)) { + // (don't have verifier) or (have verifier but isNotCorrect answer) + return createErrorRes({ + status: 401, + message: "인증을 실패하였습니다.", + }); + } - // check status value - if (!AlgorithemDTO.PostStatusArray.includes(status)) { - return createErrorRes({ - status: 400, - message: - "status값이 부적절합니다.\nstatus값에 오타가 없는지 확인해주시길 바랍니다.", - }); - } + // post algorithem + const body = await AlgorithemService.postAlgorithem({ + title: title, + content: content, + tag: tag, + }); + return createRes({ body }); + } - // check algorithem status - if ( - status == AlgorithemDTO.PostStatus.Pending || - status == AlgorithemDTO.PostStatus.Deleted - ) { - return createErrorRes({ - status: 404, - message: - "대기 상태나 삭제 상태로 교체할 수 없습니다.\n다른 API를 확인해주세요.", - }); - } + // renew algorithem's status + @AuthMiddleware.onlyOrigin + @AuthMiddleware.admin(false) + static async setAlogorithemStatus( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + // use auth middleware for admin + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) + ); + try { + //get parameter at body + const { status, reason } = JSON.parse(event.body); - // get algorithem id within path parameter - const algorithemId: string = event.pathParameters.id; + //check status value + if (!status) { + return createErrorRes({ + status: 400, + message: + "status값이 선언되지않았습니다.\n다시 값을 확인해주시길 바랍니다.", + }); + } - // get algorithem by id - const algorithem = await Post.findById(algorithemId); + // check status value + if (!AlgorithemDTO.PostStatusArray.includes(status)) { + return createErrorRes({ + status: 400, + message: + "status값이 부적절합니다.\nstatus값에 오타가 없는지 확인해주시길 바랍니다.", + }); + } - // is algorithem null? - if (algorithem == null) - return createErrorRes({ - status: 404, - message: "알고리즘을 찾을 수 없습니다.", - }); - const body = await AlgorithemService.algorithemStatusManage({ - status, - algorithem, - reason, + // check algorithem status + if ( + status == AlgorithemDTO.PostStatus.Pending || + status == AlgorithemDTO.PostStatus.Deleted + ) { + return createErrorRes({ + status: 404, + message: + "대기 상태나 삭제 상태로 교체할 수 없습니다.\n다른 API를 확인해주세요.", }); - return createRes({ body }); - } catch (error) { - // check body is json - if (error instanceof SyntaxError) { - return createErrorRes({ - status: 400, - message: "JSON 형식으로 값을 넘겨주셔야합니다.", - }); - } - throw error; } - } - ); -}; -export const modifyAlogirithemContent: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - // use auth middleware for admin - return await authMiddleware({ continuous: false })( - event, - async (event: MiddlewareDTO.certifiedEvent): Promise => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); - // get algorithem's id and modify values with path parameters and req body + // get algorithem id within path parameter const algorithemId: string = event.pathParameters.id; - const data: AlgorithemDTO.OptionalBasePostForm = JSON.parse(event.body); - // get - //declare response body - let body = {}; - try { - // modify algorithem - body = await AlgorithemService.patchAlgorithem(algorithemId, data); - } catch { - // catch notfound error + // get algorithem by id + const algorithem = await Post.findById(algorithemId); + + // is algorithem null? + if (algorithem == null) return createErrorRes({ status: 404, - message: "해당 게시물을 찾을 수 없습니다.", + message: "알고리즘을 찾을 수 없습니다.", }); - } + const body = await AlgorithemService.algorithemStatusManage({ + status, + algorithem, + reason, + }); return createRes({ body }); + } catch (error) { + // check body is json + if (error instanceof SyntaxError) { + return createErrorRes({ + status: 400, + message: "JSON 형식으로 값을 넘겨주셔야합니다.", + }); + } + throw error; } - ); -}; + } -export const reportAlogorithem: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); + @AuthMiddleware.onlyOrigin + @AuthMiddleware.admin(false) + static async modifyAlogirithemContent( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + // use auth middleware for admin - // get data - const data: { reason: string } = JSON.parse(event.body); - const id = event.pathParameters.id; + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) + ); + // get algorithem's id and modify values with path parameters and req body + const algorithemId: string = event.pathParameters.id; + const data: AlgorithemDTO.OptionalBasePostForm = JSON.parse(event.body); + // get - // set status with deleted - const body = await AlgorithemService.setDeleteStatus(id, data.reason); - return createRes({ body }); -}; + //declare response body + let body = {}; + try { + // modify algorithem + body = await AlgorithemService.patchAlgorithem(algorithemId, data); + } catch { + // catch notfound error + return createErrorRes({ + status: 404, + message: "해당 게시물을 찾을 수 없습니다.", + }); + } + return createRes({ body }); + } -export const deleteAlgorithem: Function = async ( - event: APIGatewayEvent, - __: any, - ___: Function -): Promise => { - // use middleware for admin - return await authMiddleware({ continuous: false })( - event, - async (event: MiddlewareDTO.certifiedEvent): Promise => { - mongoose - .connect(process.env.MONGO_URL ?? "", connectOptions) - .then((): void => console.log("MongoDB connected")) - .catch((err: Error): void => - console.log("Failed to connect MongoDB: ", err) - ); + @AuthMiddleware.onlyOrigin + static async reportAlogorithem( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) + ); - // get datas - const algorithemId: string = event.pathParameters.id; - const data: { reason: string } = JSON.parse(event.body); + // get data + const data: { reason: string } = JSON.parse(event.body); + const id = event.pathParameters.id; + + // set status with deleted + const body = await AlgorithemService.setDeleteStatus(id, data.reason); + return createRes({ body }); + } - // delete algorithem and get this algorithem information - const body = await AlgorithemService.deleteAlgorithem( - algorithemId, - data.reason ?? "규칙에 위반된 알고리즘이기에 삭제되었습니다." + @AuthMiddleware.onlyOrigin + @AuthMiddleware.admin(false) + static async deleteAlgorithem( + event: MiddlewareDTO.CertifiedEvent, + __: any, + ___: Function + ): Promise { + // use middleware for admin + mongoose + .connect(process.env.MONGO_URL ?? "", connectOptions) + .then((): void => console.log("MongoDB connected")) + .catch((err: Error): void => + console.log("Failed to connect MongoDB: ", err) ); - return createRes({ body }); - } - ); -}; + + // get datas + const algorithemId: string = event.pathParameters.id; + const data: { reason: string } = JSON.parse(event.body); + + // delete algorithem and get this algorithem information + const body = await AlgorithemService.deleteAlgorithem( + algorithemId, + data.reason ?? "규칙에 위반된 알고리즘이기에 삭제되었습니다." + ); + return createRes({ body }); + } +} + +export const getStatusList = Algorithem.getAlgorithemCountAtAll; +export const getAlgorithemList = Algorithem.getAlgorithemList; +export const getAlgorithemListAtPages = Algorithem.getAlgorithemListAtPages; +export const postAlgorithem = Algorithem.wirteAlogorithem; +export const modifyAlgorithem = Algorithem.modifyAlogirithemContent; +export const setAlgorithemStatus = Algorithem.setAlogorithemStatus; +export const deleteAlgorithem = Algorithem.deleteAlgorithem; +export const reportAlogorithem = Algorithem.reportAlogorithem; From a169d1255b77d954f04587e720c3d2f429eb4476 Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Sun, 3 Oct 2021 21:36:28 +0900 Subject: [PATCH 02/10] add: rules --- src/config/rule.ts | 93 ++++++++++++++++++++++++++++++++++++++++ src/routes/post/index.ts | 14 ++++++ 2 files changed, 107 insertions(+) create mode 100644 src/config/rule.ts diff --git a/src/config/rule.ts b/src/config/rule.ts new file mode 100644 index 0000000..4d423da --- /dev/null +++ b/src/config/rule.ts @@ -0,0 +1,93 @@ +export const rules = ` +제 1조 목적 + +본 규칙은 광주소프트웨어마이스터고등학교 대나무숲 규칙으로, 대나무숲의 투명한 운영 및 익명성 보장을 목적으로 한다. + +제 2조 게시글 게시에 관한 규칙 + +- 제 1항 +다음과 같은 게시물의 경우 반려 처리가 되거나, 삭제가 될 수 있다. + +1호 다른 사용자에게 불편함을 줄 수 있는 경우 + 1목 홍보를 목적으로 하는 경우 + - 매우 개인적인 사항들로, 앱 추천인이나 게임 추천인 같은 경우 + - 많은 사람들에게 불편함을 안겨주는 홍보인 경우 + 2목 친목을 다지기 위한 게시글일 경우 + 3목 욕설 및 비속어 또는 외설적인 내용을 포함하는 경우 + 다음과 같은 경우는 최우선적으로 반려되거나 삭제될 수 있다. + - 실명의 일부 이상이 언급된 경우, ex : 오xx, x병x, 오x진, xx진 + 4목 공격적인 어조로 작성한 경우 + 다음과 같은 경우는 최우선적으로 반려되거나 삭제될 수 있다. + - 실명의 일부 이상이 언급된 경우, ex : 오xx, x병x, 오x진, xx진 + 5목 제보 반려 사유를 묻는 게시글일 경우 + 6목 지나치게 길거나 지나치게 짧은 경우 + - 두페이지 이상 잡아먹는 경우 + - 한문장도 완성시키지 못하는 경우 + 7목 내용이 지나치게 부실할 경우 + 8목 해석이 불가능한 알고리즘일 경우 + 9목 타 고등학교 또는 본교를 비방, 비난하는 경우 + - 이유 없는 비판 또한 제재의 대상이 될 수 있다. + 10목 정치/종교 등 논란을 불러일으킬 여지가 있는 경우 + +2호 특정 인물이나 단체를 지칭하거나 거론하는 경우 + 단, 실명이 거론되지않는 경우 또한 포함한다. + 1목 지칭하거나 거론하여 비방하는 경우 + 2목 지칭하거나 거론하여 반복되는 게시글이 올라오는 경우 + +3호 거래, 설문조사, 분실물 회수 또는 구인/구직을 목적으로 하는 경우 +4호 분란을 조장하는 경우 +5호 관리자의 판단 아래, 반절 이상의 관리자들이 문제가 있다고 판단한 경우 + 1목 해당 조항일 경우, 관리자들의 회의록을 공개해야한다. + +- 제 2항 +제 2조 1항 2호에 해당하는 게시글이 공익을 목적으로 하는 고발성 제보일 경우, 관리자들의 회의 아래 게시될 수 있다. +단 다음 기준들이 엄격히 적용된다. + +1호 실명 거론의 경우 초성처리나 블라인드 처리로 수정된다. +2호 육하원칙에 의거하여 작성되어있어야 한다. +3호 추측성 내용이 포함되어있으면 안된다. +4호 사실만 포함되어 있어야 한다. +5호 비약적인 논리 전개가 있으면 안된다. + +- 제 3항 +이 외에 제 2조 1항의 기준에 해당되는 제보더라도, 논란의 소지가 없다고 판단되는 범위 내에서 +대나무숲 활성화를 위해 관리자의 재량으로 게시글이 게시될 수 있다. 단, 다음 기준들이 적용된다. + +1호 홍보를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 관리자에게 문의를 통해 사전 허가를 받아야 한다. +2호 설문조사를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 관리자에게 문의를 통해 사전 허가를 받아야 한다. + +제 3조 신고된 게시물에 관한 규칙 +- 제 1항 +신고 사유에 따라 다음 규칙을 지켰으며, 사실일 경우 삭제된다. + +1호 실명으로써, 언급된 본인이 삭제요청을 하였을 경우 +2호 게시물 게시 규칙에 어긋난 게시물에 대한 삭제요청일 경우 + +- 제 2항 +신고 사유가 다음과 같은 경우일 때, 기각 될 수 있다. + +1호 신고 사유가 없을 때 +2호 제 1항에 해당되지 않으며, 신고 사유가 불충분할 때 +3호 신고사유가 해당 알고리즘 내용과 상관이 없을 때 + +제 4조 특정 이슈로 인한 과열에 관한 규칙 + +- 제 1항 +특정 이슈로 대나무숲이 과열이 되는 조짐을 보일 경우, 관리자들의 자체적인 판단에 따라, 해당 주제에 관한 제보 업로드를 보류하는 시스템으로, 관리자의 판단 하에 공지 없이 시행될 수 있다. + +해당 이슈에 관한 글들은 일정 시간이 지난 이후에 하나의 게시글로 묶여 업로드 된다. +`; + +export const bold18: string[] = [ + "제 1조 목적", + "제 2조 게시글 게시에 관한 규칙", + "제 3조 신고된 게시물에 관한 규칙", + "제 4조 특정 이슈로 인한 과열에 관한 규칙", +]; + +export const bold15: string[] = [ + "- 제 1항", + "- 제 2항", + "- 제 3항", + "- 제 4항", +]; diff --git a/src/routes/post/index.ts b/src/routes/post/index.ts index 34a2018..5fe28a5 100644 --- a/src/routes/post/index.ts +++ b/src/routes/post/index.ts @@ -10,6 +10,7 @@ import verifieres from "../../model/verifieres"; import { AlgorithemService } from "../../service"; import { connectOptions } from "../../util/mongodb"; import { createRes, createErrorRes } from "../../util/serverless"; +import { rules, bold15, bold18 } from "../../config/rule"; class Algorithem { static async getAlgorithemCountAtAll( @@ -298,6 +299,19 @@ class Algorithem { ); return createRes({ body }); } + + static async getAlgorithemRule( + _: APIGatewayEvent, + __: any, + ___: Function + ): Promise { + const body = { + content: rules, + bold15, + bold18, + }; + return createRes({ body }); + } } export const getStatusList = Algorithem.getAlgorithemCountAtAll; From f233b1ef91a567e684a020ff43d7b4c79955fcd3 Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Sun, 3 Oct 2021 21:40:51 +0900 Subject: [PATCH 03/10] add : routing get ALgorithem ruels --- serverless.yml | 7 +++++++ src/routes/post/index.ts | 1 + 2 files changed, 8 insertions(+) diff --git a/serverless.yml b/serverless.yml index a52baff..df79305 100644 --- a/serverless.yml +++ b/serverless.yml @@ -88,6 +88,13 @@ functions: path: post/{id}/delete method: delete cors: true + getAlgorithemRules: + handler: src/handler.getAlgorithemRUles + events: + - http: + path: post/rule + method: get + cors: true auth: handler: src/handler.authAdmin events: diff --git a/src/routes/post/index.ts b/src/routes/post/index.ts index 5fe28a5..cae2981 100644 --- a/src/routes/post/index.ts +++ b/src/routes/post/index.ts @@ -322,3 +322,4 @@ export const modifyAlgorithem = Algorithem.modifyAlogirithemContent; export const setAlgorithemStatus = Algorithem.setAlogorithemStatus; export const deleteAlgorithem = Algorithem.deleteAlgorithem; export const reportAlogorithem = Algorithem.reportAlogorithem; +export const getAlgorithemRUles = Algorithem.getAlgorithemRule; From e96acc91e8edf6d16b2e8ecb4f8ca7fd679a4f33 Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Sun, 10 Oct 2021 19:04:19 +0900 Subject: [PATCH 04/10] =?UTF-8?q?update=20:=20rejcet=20=EC=9B=B9=ED=9B=85?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=82=B4=EC=9A=A9=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/discord.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/util/discord.ts b/src/util/discord.ts index 63aa020..7d16828 100644 --- a/src/util/discord.ts +++ b/src/util/discord.ts @@ -53,7 +53,7 @@ export const sendSetRejectedMessage: Function = async ( ): Promise => { const changeReason = reason ? `\n**거절 사유** : ${reason}` : ""; const message: DiscordDTO.SendDiscordWebhookMessage = generateWebhookMessage({ - form: data, + form: { title: data.title, content: " ", tag: data.tag }, coment: "거절된 알고리즘", description: `해당 알고리즘이 거절되었습니다.${changeReason}`, color: 16711680, @@ -89,11 +89,9 @@ export const sendACCEPTEDAlgorithemMessage: Function = async ( export const algorithemDeleteEvenetMessage: Function = async ( post: DocumentType, - reason : string + reason: string ): Promise => { - const deletedReason: string = reason - ? `\n**삭제 사유** : ${reason}` - : ""; + const deletedReason: string = reason ? `\n**삭제 사유** : ${reason}` : ""; const message: DiscordDTO.SendDiscordWebhookMessage = generateWebhookMessage({ form: { title: post.title, From cfad9e2a3bf0cf043eea1388b8c6ca6c7c62cfcc Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Mon, 11 Oct 2021 22:46:34 +0900 Subject: [PATCH 05/10] delete : admin Auth at write Algorithem --- src/routes/post/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/routes/post/index.ts b/src/routes/post/index.ts index cae2981..7ee7c5d 100644 --- a/src/routes/post/index.ts +++ b/src/routes/post/index.ts @@ -93,9 +93,8 @@ class Algorithem { // Ability to publish algorithms for those who answered the question @AuthMiddleware.onlyOrigin - @AuthMiddleware.admin(false) static async wirteAlogorithem( - event: MiddlewareDTO.CertifiedEvent, + event: APIGatewayEvent, __: any, ___: Function ): Promise { From 5abab976e66f4267503ba1fae487500839b1036e Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Tue, 12 Oct 2021 13:00:06 +0900 Subject: [PATCH 06/10] update : env example --- .env.example | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 8071e7f..0bdb901 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,8 @@ MONGO_URL= -DISCORD_WEBHOOK= -DISCORD_TEST_WEBHOOK= +DISCORD_ACCEPTED_WEBHOOK= +DISCORD_RECJECTED_WEBHOOK= +DISCORD_REPORT_WEBHOOK= DISCORD_MANAGEMENT_WEBHOOK= +DISCORD_ABOUT_DELETE_WEBHOOK= ADMIN_PASSWORD= JWT_SECRET= \ No newline at end of file From d24b611156a508c115c199855f0a46161d388dee Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Wed, 13 Oct 2021 16:42:08 +0900 Subject: [PATCH 07/10] add : rule for web --- serverless.yml | 11 +- src/config/rule.ts | 274 +++++++++++++++++++++++++++++++++++++-- src/routes/post/index.ts | 16 ++- 3 files changed, 288 insertions(+), 13 deletions(-) diff --git a/serverless.yml b/serverless.yml index df79305..234a937 100644 --- a/serverless.yml +++ b/serverless.yml @@ -8,7 +8,7 @@ provider: runtime: nodejs14.x lambdaHashingVersion: 20201221 region: ap-northeast-2 - stage: apiV2 + stage: test resources: Resources: @@ -89,12 +89,19 @@ functions: method: delete cors: true getAlgorithemRules: - handler: src/handler.getAlgorithemRUles + handler: src/handler.getAlgorithemRules events: - http: path: post/rule method: get cors: true + getAlgorithemRulesForWeb: + handler: src/handler.getAlgorithemRulesForWeb + events: + - http: + path: post/rule/web + method: get + cors: true auth: handler: src/handler.authAdmin events: diff --git a/src/config/rule.ts b/src/config/rule.ts index 4d423da..5cea2f3 100644 --- a/src/config/rule.ts +++ b/src/config/rule.ts @@ -36,11 +36,11 @@ export const rules = ` 3호 거래, 설문조사, 분실물 회수 또는 구인/구직을 목적으로 하는 경우 4호 분란을 조장하는 경우 -5호 관리자의 판단 아래, 반절 이상의 관리자들이 문제가 있다고 판단한 경우 - 1목 해당 조항일 경우, 관리자들의 회의록을 공개해야한다. +5호 대숲지기의 판단 아래, 반절 이상의 대숲지기들이 문제가 있다고 판단한 경우 + 해당 호가 해당되는 경우, 대숲지기들의 회의록을 공개해야한다. - 제 2항 -제 2조 1항 2호에 해당하는 게시글이 공익을 목적으로 하는 고발성 제보일 경우, 관리자들의 회의 아래 게시될 수 있다. +제 2조 1항 2호에 해당하는 게시글이 공익을 목적으로 하는 고발성 제보일 경우, 대숲지기들의 회의 아래 게시될 수 있다. 단 다음 기준들이 엄격히 적용된다. 1호 실명 거론의 경우 초성처리나 블라인드 처리로 수정된다. @@ -51,14 +51,14 @@ export const rules = ` - 제 3항 이 외에 제 2조 1항의 기준에 해당되는 제보더라도, 논란의 소지가 없다고 판단되는 범위 내에서 -대나무숲 활성화를 위해 관리자의 재량으로 게시글이 게시될 수 있다. 단, 다음 기준들이 적용된다. +대나무숲 활성화를 위해 대숲지기의 재량으로 게시글이 게시될 수 있다. 단, 다음 기준들이 적용된다. -1호 홍보를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 관리자에게 문의를 통해 사전 허가를 받아야 한다. -2호 설문조사를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 관리자에게 문의를 통해 사전 허가를 받아야 한다. +1호 홍보를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다. +2호 설문조사를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다. 제 3조 신고된 게시물에 관한 규칙 - 제 1항 -신고 사유에 따라 다음 규칙을 지켰으며, 사실일 경우 삭제된다. +신고 사유에 따라 다음 규칙들에 해당이 되며, 사실일 경우 삭제된다. 1호 실명으로써, 언급된 본인이 삭제요청을 하였을 경우 2호 게시물 게시 규칙에 어긋난 게시물에 대한 삭제요청일 경우 @@ -67,13 +67,13 @@ export const rules = ` 신고 사유가 다음과 같은 경우일 때, 기각 될 수 있다. 1호 신고 사유가 없을 때 -2호 제 1항에 해당되지 않으며, 신고 사유가 불충분할 때 +2호 제 3조 1항에 해당되지 않으며, 신고 사유가 불충분할 때 3호 신고사유가 해당 알고리즘 내용과 상관이 없을 때 제 4조 특정 이슈로 인한 과열에 관한 규칙 - 제 1항 -특정 이슈로 대나무숲이 과열이 되는 조짐을 보일 경우, 관리자들의 자체적인 판단에 따라, 해당 주제에 관한 제보 업로드를 보류하는 시스템으로, 관리자의 판단 하에 공지 없이 시행될 수 있다. +특정 이슈로 대나무숲이 과열이 되는 조짐을 보일 경우, 대숲지기들의 자체적인 판단에 따라, 해당 주제에 관한 제보 업로드를 보류하는 시스템으로, 대숲지기의 판단 하에 공지 없이 시행될 수 있다. 해당 이슈에 관한 글들은 일정 시간이 지난 이후에 하나의 게시글로 묶여 업로드 된다. `; @@ -91,3 +91,259 @@ export const bold15: string[] = [ "- 제 3항", "- 제 4항", ]; + +export const ruleForWeb: Object[] = [ + { + _id: 1, + title: "제 1조 목적", + content: + "본 규칙은 광주소프트웨어마이스터고등학교 대나무숲 규칙으로, 대나무숲의 투명한 운영 및 익명성 보장을 목적으로 한다.", + }, + { + _id: 2, + title: "제 2조 게시글 게시에 관한 규칙", + content: "", + subContent: [ + { + _id: 1, + title: "제 1항", + content: + "다음과 같은 게시물의 경우 반려 처리가 되거나, 삭제가 될 수 있다.", + subContent: [ + { + _id: 1, + title: "1호", + content: "다른 사용자에게 불편함을 줄 수 있는 경우", + subContent: [ + { + _id: 1, + title: "1목", + content: "홍보를 목적으로 하는 경우", + description: [ + "- 매우 개인적인 사항들로, 앱 추천인이나 게임 추천인 같은 경우", + "- 많은 사람들에게 불편함을 안겨주는 홍보인 경우", + ], + }, + { + _id: 2, + title: "2목", + content: "친목을 다지기 위한 게시글일 경우", + }, + { + _id: 3, + title: "3목", + content: "욕설 및 비속어 또는 외설적인 내용을 포함하는 경우", + description: [ + "다음과 같은 경우는 최우선적으로 반려되거나 삭제될 수 있다.", + "- 실명의 일부 이상이 언급된 경우, ex : 오xx, x병x, 오x진, xx진", + ], + }, + { + _id: 4, + title: "4목", + content: "공격적인 어조로 작성한 경우", + description: [ + "다음과 같은 경우는 최우선적으로 반려되거나 삭제될 수 있다.", + "- 실명의 일부 이상이 언급된 경우, ex : 오xx, x병x, 오x진, xx진", + ], + }, + { + _id: 5, + title: "5목", + content: "제보 반려 사유를 묻는 게시글일 경우", + }, + { + _id: 6, + title: "6목", + content: "지나치게 길거나 지나치게 짧은 경우", + description: [ + "- 두페이지 이상 차지하는 경우", + "- 한문장도 채 완성시키지 못하는 경우", + "- 글에 영양가가 없는 경우, ex : ㅎㅇ", + ], + }, + { + _id: 7, + title: "7목", + content: "내용이 지나치게 부실할 경우", + }, + { + _id: 8, + title: "8목", + content: "대숲지기가 해석이 불가능한 알고리즘일 경우", + }, + { + _id: 9, + title: "9목", + content: "타 고등학교 또는 본교를 비방, 비난하는 경우", + description: [ + "- 이유 없는 비판 또한 제재의 대상이 될 수 있다.", + ], + }, + { + _id: 10, + title: "10목", + content: "정치/종교 등 논란을 불러일으킬 여지가 있는 경우", + }, + ], + }, + { + _id: 2, + title: "2호", + content: "특정 인물이나 단체를 지칭하거나 거론하는 경우", + description: ["단, 실명이 거론되지않는 경우 또한 포함한다."], + subContents: [ + { + _id: 1, + title: "1목", + content: "지칭하거나 거론하여 비방하는 경우", + }, + { + _id: 2, + title: "2목", + content: "지칭하거나 거론하여 반복되는 게시글이 올라오는 경우", + }, + ], + }, + { + _id: 3, + title: "3호", + content: + "거래, 설문조사, 분실물 회수 또는 구인/구직을 목적으로 하는 경우", + }, + { + _id: 4, + title: "4호", + content: "분란을 조장하는 경우", + }, + { + _id: 5, + title: "5호", + content: + "대숲지기의 판단 아래, 반절 이상의 대숲지기들이 문제가 있다고 판단한 경우", + description: [ + "해당 호가 해당되는 경우, 대숲지기들의 회의록을 공개해야 한다.", + ], + }, + ], + }, + { + _id: 2, + title: "제 2항", + content: `제 2조 1항 2호에 해당되는 알고리즘이 만약 공익을 목적으로 하는 고발성 제보일 경우, 대숲지기들의 회의 아래 게시될 수 있다. + 단 다음 기준들이 엄격히 적용된다.`, + subContent: [ + { + _id: 1, + title: "1호", + content: "실명 거론의 경우 초성처리나 블라인드 처리로 수정된다.", + }, + { + _id: 2, + title: "2호", + content: "육하원칙에 의거하여 작성되어있어야 한다.", + }, + { + _id: 3, + title: "3호", + content: "추측성 내용이 포함되어있으면 안된다.", + }, + { + _id: 4, + title: "4호", + content: "사실만 포함되어 있어야 한다.", + }, + { + _id: 5, + title: "5호", + content: "비약적인 논리 전개가 있으면 안된다.", + }, + ], + }, + { + _id: 3, + title: "제 3항", + content: `이 외에 제 2조 1항의 기준에 해당되는 제보더라도, 논란의 소지가 없다고 판단되는 범위 내에서 + 대나무숲 활성화를 위해 대숲지기의 재량으로 게시글이 게시될 수 있다. + 단, 다음 기준들이 적용된다.`, + subContent: [ + { + _id: 1, + title: "1호", + content: + "홍보를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다.", + }, + { + _id: 2, + title: "2호", + content: + "설문조사를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다.", + }, + ], + }, + ], + }, + { + _id: 3, + title: "제 3조 신고된 게시물에 관한 규칙", + content: "", + subContent: [ + { + _id: 1, + title: "제 1항", + content: + "신고 사유에 따라 다음 규칙들에 해당이 되며, 사실일 경우 삭제된다.", + subContent: [ + { + _id: 1, + title: "1호", + content: "실명으로써, 언급된 본인이 삭제요청을 하였을 경우", + }, + { + _id: 2, + title: "2호", + content: "게시물 게시 규칙에 어긋난 게시물에 대한 삭제요청일 경우", + }, + ], + }, + { + _id: 2, + title: "제 2항", + content: "신고 사유가 다음과 같은 경우일 때, 기각 될 수 있다.", + subContent: [ + { + _id: 1, + title: "1호", + content: "신고 사유가 없을 때", + }, + { + _id: 2, + title: "2호", + content: "제 3조 1항에 해당되지 않으며, 신고사유가 불충분할때", + }, + { + _id: 3, + title: "3호", + content: "신고사유가 해당 알고리즘 내용과 상관이 없을 때", + }, + ], + }, + ], + }, + { + _id: 4, + title: "제 4조 특정 이슈로 인한 과열에 관한 규칙", + content: "", + subContent: [ + { + _id: 1, + title: "제 1항", + content: `특정 이슈로 대나무숲이 과열이 되는 조짐을 보일 경우, + 대숲지기들의 자체적인 판단에 따라, 해당 주제에 관한 제보 업로드를 보류하는 시스템으로, + 대숲지기의 판단하에 공지 없이 시행될 수 있다. + + 해당 이슈에 관한 글들은 일정 시간이 지난 이후에 하나의 게시글로 묶여 업로드 된다.`, + }, + ], + }, +]; diff --git a/src/routes/post/index.ts b/src/routes/post/index.ts index 7ee7c5d..eff2c57 100644 --- a/src/routes/post/index.ts +++ b/src/routes/post/index.ts @@ -10,7 +10,7 @@ import verifieres from "../../model/verifieres"; import { AlgorithemService } from "../../service"; import { connectOptions } from "../../util/mongodb"; import { createRes, createErrorRes } from "../../util/serverless"; -import { rules, bold15, bold18 } from "../../config/rule"; +import { rules, bold15, bold18, ruleForWeb } from "../../config/rule"; class Algorithem { static async getAlgorithemCountAtAll( @@ -311,6 +311,17 @@ class Algorithem { }; return createRes({ body }); } + + static async getAlgorithemRuleForWeb( + _: APIGatewayEvent, + __: AuthMiddleware, + ___: Function + ): Promise { + const body = { + content: ruleForWeb, + }; + return createRes({ body }); + } } export const getStatusList = Algorithem.getAlgorithemCountAtAll; @@ -321,4 +332,5 @@ export const modifyAlgorithem = Algorithem.modifyAlogirithemContent; export const setAlgorithemStatus = Algorithem.setAlogorithemStatus; export const deleteAlgorithem = Algorithem.deleteAlgorithem; export const reportAlogorithem = Algorithem.reportAlogorithem; -export const getAlgorithemRUles = Algorithem.getAlgorithemRule; +export const getAlgorithemRules = Algorithem.getAlgorithemRule; +export const getAlgorithemRulesForWeb = Algorithem.getAlgorithemRuleForWeb; From 6a5c2a72e5d108e8abd83e015a3d58b0a5addace Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Tue, 19 Oct 2021 15:20:55 +0900 Subject: [PATCH 08/10] update : axios --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 4401c92..bb252b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1067,7 +1067,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.1: +axios@^0.21.1, axios@^0.21.2: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== From 95e05302ef8432e83effc551b8b9c64b766d9ad4 Mon Sep 17 00:00:00 2001 From: sunrabbit123 Date: Sat, 23 Oct 2021 18:51:02 +0900 Subject: [PATCH 09/10] update : rule font --- src/config/rule.ts | 4 ++-- src/routes/post/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config/rule.ts b/src/config/rule.ts index 5cea2f3..82c17dd 100644 --- a/src/config/rule.ts +++ b/src/config/rule.ts @@ -78,14 +78,14 @@ export const rules = ` 해당 이슈에 관한 글들은 일정 시간이 지난 이후에 하나의 게시글로 묶여 업로드 된다. `; -export const bold18: string[] = [ +export const bold15: string[] = [ "제 1조 목적", "제 2조 게시글 게시에 관한 규칙", "제 3조 신고된 게시물에 관한 규칙", "제 4조 특정 이슈로 인한 과열에 관한 규칙", ]; -export const bold15: string[] = [ +export const bold13: string[] = [ "- 제 1항", "- 제 2항", "- 제 3항", diff --git a/src/routes/post/index.ts b/src/routes/post/index.ts index eff2c57..b1f2aa7 100644 --- a/src/routes/post/index.ts +++ b/src/routes/post/index.ts @@ -10,7 +10,7 @@ import verifieres from "../../model/verifieres"; import { AlgorithemService } from "../../service"; import { connectOptions } from "../../util/mongodb"; import { createRes, createErrorRes } from "../../util/serverless"; -import { rules, bold15, bold18, ruleForWeb } from "../../config/rule"; +import { rules, bold15, ruleForWeb, bold13 } from "../../config/rule"; class Algorithem { static async getAlgorithemCountAtAll( @@ -306,8 +306,8 @@ class Algorithem { ): Promise { const body = { content: rules, + bold13, bold15, - bold18, }; return createRes({ body }); } From dd6505b1ac90dd08ffd546968502718e4f79c0f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=98=A4=EB=B3=91=EC=A7=84?= <64676070+sunrabbit123@users.noreply.github.com> Date: Thu, 28 Oct 2021 08:35:37 +0900 Subject: [PATCH 10/10] Update : change version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5731cd6..4f46e30 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bamboo-api", - "version": "2.0.0", + "version": "2.1.6", "repository": "https://github.com/Promotion-official/bamboo-server.git", "author": "sunrabbit123 ", "license": "Apache-2.0",