diff --git a/src/config.ts b/src/config.ts index 827a1c4..7708266 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,77 +6,21 @@ export const CLIENT_ID_WEB = process.env.CLIENT_ID_WEB; export const TIME_A_WEEK = 7 * 24 * 60 * 60; -export const rules = ` -제 1조 목적 +export interface RuleContent { + _id: number; + title: string; + content: string; +} -본 규칙은 광주소프트웨어마이스터고등학교 대나무숲 규칙으로, 대나무숲의 투명한 운영 및 익명성 보장을 목적으로 한다. +export interface descriptionRule extends RuleContent { + description: string[]; +} -제 2조 게시글 게시에 관한 규칙 +export interface subContentrule extends RuleContent { + subContent?: Array; +} -- 제 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호 대숲지기의 판단 아래, 반절 이상의 대숲지기들이 문제가 있다고 판단한 경우 - 해당 호가 해당되는 경우, 대숲지기들의 회의록을 공개해야한다. - -- 제 2항 -제 2조 1항 2호에 해당하는 게시글이 공익을 목적으로 하는 고발성 제보일 경우, 대숲지기들의 회의 아래 게시될 수 있다. -단 다음 기준들이 엄격히 적용된다. -1호 실명 거론의 경우 초성처리나 블라인드 처리로 수정된다. -2호 육하원칙에 의거하여 작성되어있어야 한다. -3호 추측성 내용이 포함되어있으면 안된다. -4호 사실만 포함되어 있어야 한다. -5호 비약적인 논리 전개가 있으면 안된다. - -- 제 3항 -이 외에 제 2조 1항의 기준에 해당되는 제보더라도, 논란의 소지가 없다고 판단되는 범위 내에서 -대나무숲 활성화를 위해 대숲지기의 재량으로 게시글이 게시될 수 있다. 단, 다음 기준들이 적용된다. -1호 홍보를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다. -2호 설문조사를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다. -제 3조 신고된 게시물에 관한 규칙 - -- 제 1항 -신고 사유에 따라 다음 규칙들에 해당이 되며, 사실일 경우 삭제된다. -1호 실명으로써, 언급된 본인이 삭제요청을 하였을 경우 -2호 게시물 게시 규칙에 어긋난 게시물에 대한 삭제요청일 경우 - -- 제 2항 -신고 사유가 다음과 같은 경우일 때, 기각 될 수 있다. -1호 신고 사유가 없을 때 -2호 제 3조 1항에 해당되지 않으며, 신고 사유가 불충분할 때 -3호 신고사유가 해당 알고리즘 내용과 상관이 없을 때 -제 4조 특정 이슈로 인한 과열에 관한 규칙 - -- 제 1항 -특정 이슈로 대나무숲이 과열이 되는 조짐을 보일 경우, 대숲지기들의 자체적인 판단에 따라, 해당 주제에 관한 제보 업로드를 보류하는 시스템으로, 대숲지기의 판단 하에 공지 없이 시행될 수 있다. -해당 이슈에 관한 글들은 일정 시간이 지난 이후에 하나의 게시글로 묶여 업로드 된다. -`; +type Rule = subContentrule[]; export const bold15: string[] = [ "제 1조 목적", @@ -92,7 +36,7 @@ export const bold13: string[] = [ "- 제 4항", ]; -export const ruleForWeb: Object[] = [ +export const ruleForWeb: Rule = [ { _id: 1, title: "제 1조 목적", @@ -192,7 +136,7 @@ export const ruleForWeb: Object[] = [ title: "2호", content: "특정 인물이나 단체를 지칭하거나 거론하는 경우", description: ["단, 실명이 거론되지않는 경우 또한 포함한다."], - subContents: [ + subContent: [ { _id: 1, title: "1목", @@ -347,3 +291,75 @@ export const ruleForWeb: Object[] = [ ], }, ]; + +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호 대숲지기의 판단 아래, 반절 이상의 대숲지기들이 문제가 있다고 판단한 경우 + 해당 호가 해당되는 경우, 대숲지기들의 회의록을 공개해야한다. + +- 제 2항 +제 2조 1항 2호에 해당하는 게시글이 공익을 목적으로 하는 고발성 제보일 경우, 대숲지기들의 회의 아래 게시될 수 있다. +단 다음 기준들이 엄격히 적용된다. +1호 실명 거론의 경우 초성처리나 블라인드 처리로 수정된다. +2호 육하원칙에 의거하여 작성되어있어야 한다. +3호 추측성 내용이 포함되어있으면 안된다. +4호 사실만 포함되어 있어야 한다. +5호 비약적인 논리 전개가 있으면 안된다. + +- 제 3항 +이 외에 제 2조 1항의 기준에 해당되는 제보더라도, 논란의 소지가 없다고 판단되는 범위 내에서 +대나무숲 활성화를 위해 대숲지기의 재량으로 게시글이 게시될 수 있다. 단, 다음 기준들이 적용된다. +1호 홍보를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다. +2호 설문조사를 목적으로 하는 게시글일 경우, 디스코드 대나무숲 서버를 통해 대숲지기에게 문의를 통해 사전 허가를 받아야 한다. +제 3조 신고된 게시물에 관한 규칙 + +- 제 1항 +신고 사유에 따라 다음 규칙들에 해당이 되며, 사실일 경우 삭제된다. +1호 실명으로써, 언급된 본인이 삭제요청을 하였을 경우 +2호 게시물 게시 규칙에 어긋난 게시물에 대한 삭제요청일 경우 + +- 제 2항 +신고 사유가 다음과 같은 경우일 때, 기각 될 수 있다. +1호 신고 사유가 없을 때 +2호 제 3조 1항에 해당되지 않으며, 신고 사유가 불충분할 때 +3호 신고사유가 해당 알고리즘 내용과 상관이 없을 때 +제 4조 특정 이슈로 인한 과열에 관한 규칙 + +- 제 1항 +특정 이슈로 대나무숲이 과열이 되는 조짐을 보일 경우, 대숲지기들의 자체적인 판단에 따라, 해당 주제에 관한 제보 업로드를 보류하는 시스템으로, 대숲지기의 판단 하에 공지 없이 시행될 수 있다. +해당 이슈에 관한 글들은 일정 시간이 지난 이후에 하나의 게시글로 묶여 업로드 된다. +`; diff --git a/src/middleware/auth.ts b/src/middleware/auth.ts index 6915cde..5840c69 100644 --- a/src/middleware/auth.ts +++ b/src/middleware/auth.ts @@ -130,7 +130,7 @@ export class AuthMiddleware { const answer = body.verify?.answer; if (!(verifyId && answer)) { - createErrorRes({ errorCode: "JL003" }); + return createErrorRes({ errorCode: "JL003" }); } return (await checkQuestionAnswer(verifyId, answer, req.connectionName)) diff --git a/src/repository/algorithm.ts b/src/repository/algorithm.ts index cf1214b..f59b411 100644 --- a/src/repository/algorithm.ts +++ b/src/repository/algorithm.ts @@ -40,15 +40,18 @@ export class AlgorithmRepository extends Repository { "algorithm.createdAt", "algorithm.reason", ]) - .leftJoinAndSelect("algorithm.emojis", "emoji") - .where("algorithm.algorithmStatus = :status1", { - status1: status, - }); + .leftJoinAndSelect("algorithm.emojis", "emoji"); return status === "ACCEPTED" - ? base.orWhere("algorithm.algorithmStatus = :status2", { - status2: "REPORTED", - }) - : base; + ? base + .where("(algorithm.algorithmStatus = :status1 ", { + status1: status, + }) + .orWhere("algorithm.algorithmStatus = :status2 )", { + status2: "REPORTED", + }) + : base.where("algorithm.algorithmStatus = :status1", { + status1: status, + }); } getList( { count, criteria, status }: JoinAlgorithmDTO, @@ -71,7 +74,7 @@ export class AlgorithmRepository extends Repository { cursor: (base: SelectQueryBuilder, criteria: number) => { return criteria === 0 ? base - : base.andWhere("algorithm.algorithmNumber <= :criteria", { + : base.andWhere("algorithm.algorithmNumber < :criteria", { criteria, }); }, @@ -143,15 +146,18 @@ export class AlgorithmRepository extends Repository { .andWhere( "algorithm.algorithmNumber between :lastNumber and :firstNumber", { lastNumber, firstNumber }, - ) - .andWhere("algorithm.algorithmStatus = :status", { status }); + ); - const query = - status === "ACCEPTED" - ? baseQuery.orWhere("algorithm.algorithmStatus = :orStatus", { - orStatus: "REPORTED", - }) - : baseQuery; + const statusWhereQuery = + "(algorithm.algorithmStatus = :status" + + (status === "ACCEPTED" + ? " OR algorithm.algorithmStatus = :orStatus)" + : ")"); + + const query = baseQuery.andWhere(statusWhereQuery, { + status, + orStatus: "REPORTED", + }); return query.orderBy("algorithmNumber", "DESC").getMany(); } diff --git a/src/router/algorithm/algorithm.service.ts b/src/router/algorithm/algorithm.service.ts index 0142ba6..7b4c9ba 100644 --- a/src/router/algorithm/algorithm.service.ts +++ b/src/router/algorithm/algorithm.service.ts @@ -10,7 +10,10 @@ import { Algorithm } from "../../entity"; import { AlgorithmRepository } from "../../repository/algorithm"; -import { getAlgorithmList } from "../../util/algorithm"; +import { + generateAlgorithmListResponse, + getAlgorithmList, +} from "../../util/algorithm"; import { createErrorRes, createRes } from "../../util/http"; import { isNumeric } from "../../util/number"; import { @@ -75,8 +78,15 @@ export const AlgorithmService: { [k: string]: Function } = { type, ); + const data = generateAlgorithmListResponse({ + algorithmList: result, + status: STATUS, + count, + type, + }); + return createRes({ - data: { data: result, status: STATUS }, + data, }); }, getAlgorithmListByAdmin: async (event: APIGatewayEventIncludeDBName) => { @@ -102,8 +112,15 @@ export const AlgorithmService: { [k: string]: Function } = { sub, type, ); + const data = generateAlgorithmListResponse({ + algorithmList: result, + status: STATUS, + count, + type, + }); + return createRes({ - data: { data: result, status: STATUS }, + data, }); }, diff --git a/src/router/emoji/emoji.service.ts b/src/router/emoji/emoji.service.ts index 83b102a..e877312 100644 --- a/src/router/emoji/emoji.service.ts +++ b/src/router/emoji/emoji.service.ts @@ -25,12 +25,12 @@ export const EmojiService: { [k: string]: Function } = { const preResult = ( await emojiRepo.find({ - where: { user: subId, algorithm: number }, + where: { user: subId, algorithm: { idx: number } }, }) )[0]; - if (!preResult) { - return createErrorRes({ errorCode: "JL012" }); + if (!!preResult) { + return createErrorRes({ errorCode: "JL013" }); } const result = await emojiRepo.addLeaf(subId, number); diff --git a/src/util/algorithm.ts b/src/util/algorithm.ts index c484a0a..69195b2 100644 --- a/src/util/algorithm.ts +++ b/src/util/algorithm.ts @@ -1,8 +1,33 @@ import { getCustomRepository } from "typeorm"; -import { JoinAlgorithmDTO } from "../DTO/algorithm.dto"; +import { + AlgorithmListType, + AlgorithmStatusType, + JoinAlgorithmDTO, +} from "../DTO/algorithm.dto"; import { Algorithm } from "../entity"; import { AlgorithmRepository } from "../repository/algorithm"; +export const generateAlgorithmListResponse: Function = ({ + algorithmList, + status, + count, + type, +}: { + algorithmList: Algorithm[]; + status: AlgorithmStatusType; + count: number; + type: AlgorithmListType; +}) => + Object.assign( + {}, + { data: algorithmList, status }, + type == "cursor" + ? { + hasNext: algorithmList.length == Number(count), + nextCursor: algorithmList[algorithmList.length - 1].algorithmNumber, + } + : {}, + ); export const algorithmListMergeEmojiList: Function = ( algorithmList: Algorithm[], isClickedByUser: Algorithm[], diff --git a/src/util/http.ts b/src/util/http.ts index 41bef09..c33d31a 100644 --- a/src/util/http.ts +++ b/src/util/http.ts @@ -23,6 +23,7 @@ export const ERROR_CODE_LIST = { JL010: "허용되지않은 값입니다.", JL011: "비밀번호 또는 유저 인증에 실패하였습니다.", JL012: "해당 알고리즘을 찾을 수 없습니다.", + JL013: "이미 눌러진 이모지입니다.", } as const; export type ErrorCodeType = keyof typeof ERROR_CODE_LIST;