Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/controllers/history.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Query,
Response,
Body,
Path,
} from 'tsoa';
import { Request as ExpressRequest } from 'express';
import { BaseError, DataValidationError, ServerError } from '../errors.js';
Expand All @@ -26,9 +27,11 @@ export class MostTaggedController extends Controller{
* 사용자의 사진들의 카테고리별로 가장 많은 태그를 조회합니다.
*
* @summary 인기 태그 조회 API
* @param year 인기태그 년도
* @param month 인기태그 월
* @returns 인기 태그
*/
@Get('/history/most_tagged/get')
@Get('/history/most_tagged/get/:year/:month')
@Tags('History')
@SuccessResponse('200', 'OK')
@Response<ITsoaErrorResponse>(
Expand Down Expand Up @@ -72,13 +75,15 @@ export class MostTaggedController extends Controller{
)
public async getMostTagged(
@Request() req: ExpressRequest,
@Path('year') year: number,
@Path('month') month: number
): Promise<ITsoaSuccessResponse<ResponseFromMostTagToClient[]>> {
if(!req.user){
throw new DataValidationError({reason: '유저 정보가 없습니다. 다시 로그인 해주세요.'});
}
const userId: bigint = req.user.id;

const result: ResponseFromMostTagToClient[] = await serviceGetMostTagged(userId)
const result: ResponseFromMostTagToClient[] = await serviceGetMostTagged(userId, year, month)
.then(r => {
return r;
})
Expand Down
2 changes: 1 addition & 1 deletion src/db.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,4 @@ export const pool = mysql.createPool({
queueLimit: 0, // getConnection에서 오류가 발생하기 전에 Pool에 대기할 요청의 개수 한도
});

export const prisma = new PrismaClient();
export const prisma = new PrismaClient({log: ['query']});
15 changes: 10 additions & 5 deletions src/dtos/history.dto.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Award, AwardImage } from '@prisma/client';
import { ResponseFromMostTag, ResponseFromMostTagToClient, ResponseFromAward, ResponseFromUpdateAward } from '../models/history.model.js';
import { ResponseFromMostTag, ResponseFromMostTagToClient, ResponseFromAward, ResponseFromUpdateAward, ResponseFromAwardImage } from '../models/history.model.js';

export const responseFromMostTag = (
arr: ResponseFromMostTag[]
Expand Down Expand Up @@ -55,18 +55,23 @@ export const bodyToUpdateAward = (
};

export const responseFromGetAward = (
awards: Award[]
awards: ResponseFromAwardImage[]
): ResponseFromAward[] => {
return awards.map((value: Award) => {
const {id, userId, awardMonth, createdAt, updatedAt, status} = value;
return awards.map((value: ResponseFromAwardImage) => {
const {id, userId, awardMonth, createdAt, updatedAt, status, images } = value;

const ims: {imageId: string}[] = images.map((value: {image: {mediaId: bigint}}) => {
return {imageId: value.image.mediaId.toString()};
});

return {
id: id.toString(),
userId: userId.toString(),
awardMonth,
createdAt,
updatedAt,
status
status,
images: ims
};
});
};
15 changes: 15 additions & 0 deletions src/models/history.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,19 @@ export interface ResponseFromUpdateAward{
updatedAt: Date | null;
status: number;
awardId: string;
}

export interface ResponseFromAwardImage{
id: bigint,
awardMonth: Date,
createdAt: Date,
updatedAt: Date | null,
status: number,
userId: bigint,
images: {
imageId: bigint
image: {
mediaId: bigint
}
}[]
}
34 changes: 24 additions & 10 deletions src/repositories/history.repositories.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import { ResponseFromMostTag } from '../models/history.model.js';
import { ResponseFromAwardImage, ResponseFromMostTag } from '../models/history.model.js';
import {prisma} from '../db.config.js';
import { AwardImageError, DuplicateAwardError, NoDataFoundError } from '../errors.js';
import { Award, AwardImage } from '@prisma/client';

export const getMostTagged = async (userId: bigint): Promise<ResponseFromMostTag[]> => {
const currentTime: Date = new Date();
const currentMonth: Date = new Date(currentTime.getFullYear(), currentTime.getMonth(), 1); //이번 달의 시작
const nextMonth: Date = new Date(currentTime.getFullYear() + (
currentTime.getMonth() === 1
export const getMostTagged = async (userId: bigint, year: number, month: number): Promise<ResponseFromMostTag[]> => {
const currentMonth: Date = new Date(year, month - 1, 1); //이번 달의 시작
const nextMonth: Date = new Date(year + (
month === 12
? 1
: 0
),(currentTime.getMonth() + 1) % 12, 1); //다음 달의 시작. 12월이면 하나 올리기
), month % 12, 1); //다음 달의 시작. 12월이면 하나 올리기

//console.log(currentMonth + ' ' + nextMonth);

const userImages = await prisma.image.findMany({
where: {
Expand All @@ -37,7 +38,8 @@ export const getMostTagged = async (userId: bigint): Promise<ResponseFromMostTag
where: {
imageId: {
in: userImages.map((value: {id: bigint;}) => value.id)
}
},
status: 1
},
select: {
tagId: true
Expand Down Expand Up @@ -139,12 +141,24 @@ export const updateAwardImage = async (userId: bigint, awardId: bigint, imageId:
return result;
};

export const getUserAwards = async (userId: bigint): Promise<Award[]> => {
const userAwards: Award[] = await prisma.award.findMany({
export const getUserAwards = async (userId: bigint): Promise<ResponseFromAwardImage[]> => {
const userAwards: ResponseFromAwardImage[] = await prisma.award.findMany({
include: {
images: {
include: {
image: {
select: {
mediaId: true
}
}
}
}
},
where: {
userId: userId
}
});

//console.log(userAwards[0].images);
return userAwards;
};
4 changes: 3 additions & 1 deletion src/routers/tsoaRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1010,8 +1010,10 @@ export function RegisterRoutes(app: Router) {
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa
const argsMostTaggedController_getMostTagged: Record<string, TsoaRoute.ParameterSchema> = {
req: {"in":"request","name":"req","required":true,"dataType":"object"},
year: {"in":"path","name":"year","required":true,"dataType":"double"},
month: {"in":"path","name":"month","required":true,"dataType":"double"},
};
app.get('/user/history/most_tagged/get',
app.get('/user/history/most_tagged/get/:year/:month',
...(fetchMiddlewares<RequestHandler>(MostTaggedController)),
...(fetchMiddlewares<RequestHandler>(MostTaggedController.prototype.getMostTagged)),

Expand Down
8 changes: 4 additions & 4 deletions src/services/history.services.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Award, AwardImage } from '@prisma/client';
import { responseFromGetAward, responseFromMostTag, responseFromNewAward, responseFromUpdateAward } from '../dtos/history.dto.js';
import { AwardUpdateError, DuplicateAwardError, NoDataFoundError } from '../errors.js';
import { ResponseFromMostTag, ResponseFromMostTagToClient, ResponseFromAward } from '../models/history.model.js';
import { ResponseFromMostTag, ResponseFromMostTagToClient, ResponseFromAward, ResponseFromAwardImage } from '../models/history.model.js';
import { getMostTagged, getUserAwards, newUserAward, updateAwardImage } from '../repositories/history.repositories.js';


export const serviceGetMostTagged = async (userId: bigint): Promise<ResponseFromMostTagToClient[]> => {
const result: ResponseFromMostTag[] = await getMostTagged(userId);
export const serviceGetMostTagged = async (userId: bigint, year: number, month: number): Promise<ResponseFromMostTagToClient[]> => {
const result: ResponseFromMostTag[] = await getMostTagged(userId, year, month);

if(result === null || result.length === 0){
throw new NoDataFoundError({reason: `유저 ${userId}의 태그를 찾을 수 없습니다.`});
Expand Down Expand Up @@ -54,7 +54,7 @@ export const serviceUpdateAward = async (userId: bigint, awardId: bigint, mediaI
};

export const serviceGetAward = async (userId: bigint): Promise<ResponseFromAward[]> => {
const result: Award[] | null = await getUserAwards(userId);
const result: ResponseFromAwardImage[] | null = await getUserAwards(userId);

if(result === null || result.length === 0){
throw new NoDataFoundError({reason: `${userId} 유저의 어워드가 존재하지 않습니다.`});
Expand Down
25 changes: 23 additions & 2 deletions swagger/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -2718,7 +2718,7 @@
}
}
},
"/user/history/most_tagged/get": {
"/user/history/most_tagged/get/{year}/{month}": {
"get": {
"operationId": "GetMostTagged",
"responses": {
Expand Down Expand Up @@ -2808,7 +2808,28 @@
"History"
],
"security": [],
"parameters": []
"parameters": [
{
"description": "인기태그 년도",
"in": "path",
"name": "year",
"required": true,
"schema": {
"format": "double",
"type": "number"
}
},
{
"description": "인기태그 월",
"in": "path",
"name": "month",
"required": true,
"schema": {
"format": "double",
"type": "number"
}
}
]
}
},
"/user/history/award/create": {
Expand Down