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
16 changes: 16 additions & 0 deletions src/ai/ai-upload.middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {Request, Response, NextFunction} from 'express';
import upload from './ai-upload.js';

export const uploadMiddleware = (
req: Request,
res: Response,
next: NextFunction,
) => {
upload.single('base64_image')(req, res, err => {
if (err) {
next(err);
} else {
next();
}
});
};
6 changes: 0 additions & 6 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,7 @@ import {authRouter} from './routers/auth.routers.js';
import {userRouter} from './routers/user.router.js';
import {tagRouter} from './routers/tag.router.js';
import {myPageRouter} from './routers/mypage.routers.js';
import {imageUploader} from './s3/image.uploader.js';
import {trustRouter} from './routers/trust.router.js';
import upload from './ai/ai-upload.js';

dotenv.config();

Expand Down Expand Up @@ -119,10 +117,6 @@ app.use('/tag', tagRouter);
app.use('/trust', trustRouter);
app.post('/image/ai', labelDetectionController);

app.post('/memo/text-format/folders', upload.single('base64_image'));
app.patch('/memo/text-format/folders/:folderId', upload.single('base64_image'));
app.post('/memo/image-format/folders', imageUploader.single('image'));
app.post('/memo/image-format/folders/:folderId', imageUploader.single('image'));
RegisterRoutes(app);

app.get('/', (req: Request, res: Response) => {
Expand Down
3 changes: 3 additions & 0 deletions src/controllers/memo-createFolderOCR.Controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@ import {
Response,
Tags,
Post,
Middlewares,
} from 'tsoa';
import {
ITsoaErrorResponse,
ITsoaSuccessResponse,
TsoaSuccessResponse,
} from '../models/tsoaResponse.js';
import {uploadMiddleware} from '../ai/ai-upload.middleware.js';

@Route('memo')
export class MemoCreateUpdateOCRController extends Controller {
Expand All @@ -34,6 +36,7 @@ export class MemoCreateUpdateOCRController extends Controller {
* @returns 성공 시 폴더를 생성하고 텍스트를 저장한 결과를 반환합니다.
*/
@Post('/text-format/folders')
@Middlewares(uploadMiddleware)
@Tags('memo-ai')
@Response<ITsoaErrorResponse>(StatusCodes.BAD_REQUEST, '잘못된 요청 데이터', {
resultType: 'FAIL',
Expand Down
3 changes: 3 additions & 0 deletions src/controllers/memo-updateFolderOCR.Controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@ import {
SuccessResponse,
Example,
Patch,
Middlewares,
} from 'tsoa';
import {StatusCodes} from 'http-status-codes';
import {uploadMiddleware} from '../ai/ai-upload.middleware.js';

@Route('memo')
export class MemoCreateFolderOCRController extends Controller {
Expand All @@ -35,6 +37,7 @@ export class MemoCreateFolderOCRController extends Controller {
* @returns 성공 시 특정 폴더에 텍스트를 저장한 결과를 반환합니다.
*/
@Patch('/text-format/folders/:folderId')
@Middlewares(uploadMiddleware)
@Tags('memo-ai')
@Response<ITsoaErrorResponse>(StatusCodes.BAD_REQUEST, '잘못된 요청 데이터', {
resultType: 'FAIL',
Expand Down
128 changes: 72 additions & 56 deletions src/controllers/trust.controller.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import {Request, Response, NextFunction} from 'express';
import * as trustService from '../services/trust.service.js';
import {SearchNoResultsError,ServerError,DataValidationError} from 'src/errors.js';
import {SearchNoResultsError, DataValidationError} from 'src/errors.js';
import {StatusCodes} from 'http-status-codes';

export const handleImageStatus = async (req: Request, res: Response, next:NextFunction): Promise<void> => {
/*
export const handleImageStatus = async (
req: Request,
res: Response,
next: NextFunction,
): Promise<void> => {
/*
#swagger.tags = ['Trust']
#swagger.summary = '휴지통으로 이미지 이동 API'
#swagger.description = '선택한 이미지를 휴지통으로 이동시키는 API입니다.'
Expand Down Expand Up @@ -89,30 +93,34 @@ export const handleImageStatus = async (req: Request, res: Response, next:NextFu
}
}
*/
try {
const {mediaId} = req.body;
const parsedMediaId = parseInt(mediaId);
if (isNaN(parsedMediaId)) {
throw new SearchNoResultsError({searchKeyword: 'mediaId가 올바르지 않습니다'});
}
const updatedImage = await trustService.deactivateImages(mediaId);
if (!updatedImage) {
throw new SearchNoResultsError({ searchKeyword: '해당 mediaId에 대한 이미지가 존재하지 않습니다' });
}
const result = {
mediaId: updatedImage.mediaId,
status: updatedImage.status
};
res.status(StatusCodes.OK).success(result);
} catch (error) {
next(error);
try {
const {mediaId} = req.body;
const parsedMediaId = parseInt(mediaId);
if (isNaN(parsedMediaId)) {
throw new SearchNoResultsError({
searchKeyword: 'mediaId가 올바르지 않습니다',
});
}
const updatedImage = await trustService.deactivateImages(mediaId);
if (!updatedImage) {
throw new SearchNoResultsError({
searchKeyword: '해당 mediaId에 대한 이미지가 존재하지 않습니다',
});
}
const result = {
mediaId: updatedImage.mediaId,
status: updatedImage.status,
};
res.status(StatusCodes.OK).success(result);
} catch (error) {
next(error);
}
};

export const handleImageRestore = async (
req: Request,
res: Response,
next: NextFunction
req: Request,
res: Response,
next: NextFunction,
): Promise<void> => {
/*
#swagger.tags = ['Trust']
Expand Down Expand Up @@ -202,31 +210,35 @@ export const handleImageRestore = async (
}
}
*/
try {
const {mediaIds} = req.body;
if (!Array.isArray(mediaIds)) {
throw new SearchNoResultsError({searchKeyword: 'mediaIds가 올바르지 않습니다'});
}
const restoredImages = await trustService.restoreImages(mediaIds);
if (!restoredImages.length) {
throw new SearchNoResultsError({ searchKeyword: '해당 mediaIds에 대한 이미지가 존재하지 않습니다' });
}
const result = restoredImages.map(image => ({
mediaId: image.mediaId,
status: image.status
}));
res.status(StatusCodes.OK).success(result);
} catch (error) {
next(error);
try {
const {mediaIds} = req.body;
if (!Array.isArray(mediaIds)) {
throw new SearchNoResultsError({
searchKeyword: 'mediaIds가 올바르지 않습니다',
});
}
const restoredImages = await trustService.restoreImages(mediaIds);
if (!restoredImages.length) {
throw new SearchNoResultsError({
searchKeyword: '해당 mediaIds에 대한 이미지가 존재하지 않습니다',
});
}
const result = restoredImages.map(image => ({
mediaId: image.mediaId,
status: image.status,
}));
res.status(StatusCodes.OK).success(result);
} catch (error) {
next(error);
}
};

export const handleImageDelete = async (
req: Request,
res: Response,
next: NextFunction
res: Response,
next: NextFunction,
): Promise<void> => {
/*
/*
#swagger.tags = ['Trust']
#swagger.summary = '휴지통에서 이미지 삭제 API'
#swagger.description = '선택한 이미지를 휴지통에서 삭제하는 API입니다.'
Expand Down Expand Up @@ -339,18 +351,22 @@ export const handleImageDelete = async (
}
}
*/
try {
const { mediaIds } = req.body;
if (!Array.isArray(mediaIds)) {
throw new SearchNoResultsError({searchKeyword: 'mediaIds가 올바르지 않습니다'});
}
const deleteable = await trustService.deleteImages(mediaIds);
if(!deleteable) {
throw new DataValidationError({reason: '해당 사진이 휴지통에 존재하지 않습니다'});
}
res.status(StatusCodes.OK).success(deleteable);
} catch (error) {
next(error);

try {
const {mediaIds} = req.body;
if (!Array.isArray(mediaIds)) {
throw new SearchNoResultsError({
searchKeyword: 'mediaIds가 올바르지 않습니다',
});
}
const deleteable = await trustService.deleteImages(mediaIds);
if (!deleteable) {
throw new DataValidationError({
reason: '해당 사진이 휴지통에 존재하지 않습니다',
});
}
};
res.status(StatusCodes.OK).success(deleteable);
} catch (error) {
next(error);
}
};
3 changes: 3 additions & 0 deletions src/controllers/tsoa.memo-folder.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
Patch,
Example,
FormField,
Middlewares,
} from 'tsoa';
import {
BodyToMemoFolder,
Expand All @@ -46,6 +47,7 @@ import {
} from '../models/tsoaResponse.js';
import {BodyToMemoImagesToDelete} from '../models/memo-image.model.tsoa.js';
import {Request as ExpressRequest, Express} from 'express';
import {ImageUploadMiddleware} from '../s3/image.uploader.middleware.js';

@Route('memo')
export class MemoFolderController extends Controller {
Expand All @@ -60,6 +62,7 @@ export class MemoFolderController extends Controller {
*
*/
@Post('/image-format/folders')
@Middlewares(ImageUploadMiddleware)
@Tags('memo-folder-controller')
@Response<ITsoaErrorResponse>(
StatusCodes.BAD_REQUEST,
Expand Down
3 changes: 3 additions & 0 deletions src/controllers/tsoa.memo-image.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
Tags,
Example,
Post,
Middlewares,
} from 'tsoa';
import {
ITsoaErrorResponse,
Expand All @@ -32,6 +33,7 @@ import {
import {StatusCodes} from 'http-status-codes';
import {BodyToMemoImagesToMove} from '../models/memo-image.model.tsoa.js';
import {PhotoDataNotFoundError} from '../errors.js';
import {ImageUploadMiddleware} from '../s3/image.uploader.middleware.js';

@Route('memo')
export class MemoImageController extends Controller {
Expand All @@ -44,6 +46,7 @@ export class MemoImageController extends Controller {
* @returns 성공 시 사진 저장 결과를 반환합니다.
*/
@Post('/image-format/folders/:folderId')
@Middlewares(ImageUploadMiddleware)
@Tags('memo-image-controller')
@Response<ITsoaErrorResponse>(
StatusCodes.BAD_REQUEST,
Expand Down
16 changes: 16 additions & 0 deletions src/s3/image.uploader.middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {Request, Response, NextFunction} from 'express';
import {imageUploader} from './image.uploader.js';
// import {PhotoValidationError} from '../errors.js';

export const ImageUploadMiddleware = (
req: Request,
res: Response,
next: NextFunction,
) => {
imageUploader.single('image')(req, res, err => {
if (err) {
next(err);
}
next();
});
};
Loading