diff --git a/BE/package-lock.json b/BE/package-lock.json index 920c8ab..feab7fd 100644 --- a/BE/package-lock.json +++ b/BE/package-lock.json @@ -28,6 +28,7 @@ "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "typeorm": "^0.3.17", + "uuid": "^9.0.1", "winston": "^3.11.0" }, "devDependencies": { @@ -1660,6 +1661,14 @@ "reflect-metadata": "^0.1.13" } }, + "node_modules/@nestjs/config/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@nestjs/core": { "version": "10.2.8", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.2.8.tgz", @@ -1896,18 +1905,6 @@ "typeorm": "^0.3.0" } }, - "node_modules/@nestjs/typeorm/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -9462,9 +9459,13 @@ } }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } diff --git a/BE/package.json b/BE/package.json index ac2585a..d5c4b4d 100644 --- a/BE/package.json +++ b/BE/package.json @@ -39,6 +39,7 @@ "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "typeorm": "^0.3.17", + "uuid": "^9.0.1", "winston": "^3.11.0" }, "devDependencies": { diff --git a/BE/src/users/interface/greeneye.interface.ts b/BE/src/users/interface/greeneye.interface.ts new file mode 100644 index 0000000..2fb687a --- /dev/null +++ b/BE/src/users/interface/greeneye.interface.ts @@ -0,0 +1,19 @@ +export interface GreenEyeResponse { + version: string; + requestId: string; + timestamp: number; + images: [ + { + message: string; + name: string; + result: { + adult: { confidence: number }; + normal: { confidence: number }; + porn: { confidence: number }; + sexy: { confidence: number }; + }; + latency: number; + confidence: number; + }, + ]; +} diff --git a/BE/src/users/users.service.ts b/BE/src/users/users.service.ts index 1c25119..b2284c7 100644 --- a/BE/src/users/users.service.ts +++ b/BE/src/users/users.service.ts @@ -4,12 +4,16 @@ import { Repository } from 'typeorm'; import { UsersModel } from './entity/users.entity'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; +import { ConfigService } from '@nestjs/config'; +import { v4 } from 'uuid'; +import { GreenEyeResponse } from './interface/greeneye.interface'; @Injectable() export class UsersService { constructor( @InjectRepository(UsersModel) private usersRepository: Repository, + private config: ConfigService, ) {} async createUser(user: CreateUserDto): Promise { @@ -62,4 +66,48 @@ export class UsersService { return selectedUser; } + + async isNormalImage(image_url: string): Promise { + const THRESHOLD = 0.5; + const response = await this.requestClovaGreenEye(image_url); + const result = response.images[0].result; + const message = response.images[0].message; + if (message !== 'SUCCESS') { + throw new BadRequestException('이미지 인식 실패'); + } + const normalScore = result.normal.confidence; + const isNormal = normalScore > THRESHOLD ? true : false; + + return isNormal; + } + + async requestClovaGreenEye(image_url: string): Promise { + const APIURL = this.config.get('GREENEYE_URL'); + const CLIENT_SECRET = this.config.get('GREENEYE_SECRET'); + const UUID = v4(); + try { + const response = await fetch(APIURL, { + method: 'POST', + headers: { + 'X-GREEN-EYE-SECRET': CLIENT_SECRET, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + version: 'V1', + requestId: UUID, + timestamp: Date.now(), + images: [ + { + name: `${UUID}_profile`, + url: image_url, + }, + ], + }), + }); + + return response.json(); + } catch (error) { + throw new BadRequestException('이미지 검사 요청 실패'); + } + } }