From 79c54caf859872eb5b5df0e094b3ebb40504d87b Mon Sep 17 00:00:00 2001 From: publdaze Date: Wed, 23 Aug 2023 12:16:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=95=8C=EB=A6=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 53 +++++++++++++++++++++++ package.json | 1 + src/app.module.ts | 5 ++- src/auth/auth.repository.ts | 15 +++++++ src/auth/auth.service.ts | 5 ++- src/buildings/buildings.repository.ts | 9 ++++ src/buildings/floors/cans/cans.module.ts | 5 ++- src/buildings/floors/cans/cans.service.ts | 39 ++++++++++++++++- src/users/entities/user.entity.ts | 3 ++ src/users/users.repository.ts | 10 +++++ src/users/users.service.ts | 1 + 11 files changed, 141 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46bbb90..0569ba4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@nestjs/mongoose": "^10.0.1", "@nestjs/passport": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "@nestjs/schedule": "^3.0.3", "@nestjs/swagger": "^7.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", @@ -1538,6 +1539,20 @@ "@nestjs/core": "^10.0.0" } }, + "node_modules/@nestjs/schedule": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-3.0.3.tgz", + "integrity": "sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==", + "dependencies": { + "cron": "2.4.1", + "uuid": "9.0.0" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.12" + } + }, "node_modules/@nestjs/schematics": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.0.1.tgz", @@ -3391,6 +3406,14 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.1.tgz", + "integrity": "sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==", + "dependencies": { + "luxon": "^3.2.1" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5815,6 +5838,14 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", + "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/macos-release": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", @@ -9609,6 +9640,15 @@ "tslib": "2.6.0" } }, + "@nestjs/schedule": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-3.0.3.tgz", + "integrity": "sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg==", + "requires": { + "cron": "2.4.1", + "uuid": "9.0.0" + } + }, "@nestjs/schematics": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.0.1.tgz", @@ -11040,6 +11080,14 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.1.tgz", + "integrity": "sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==", + "requires": { + "luxon": "^3.2.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -12874,6 +12922,11 @@ "yallist": "^3.0.2" } }, + "luxon": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", + "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==" + }, "macos-release": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", diff --git a/package.json b/package.json index 4a43aef..4e4e112 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@nestjs/mongoose": "^10.0.1", "@nestjs/passport": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "@nestjs/schedule": "^3.0.3", "@nestjs/swagger": "^7.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", diff --git a/src/app.module.ts b/src/app.module.ts index 870014d..a86d388 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -6,6 +6,7 @@ import { MongooseModule } from '@nestjs/mongoose'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { AuthModule } from './auth/auth.module'; import { UsersModule } from './users/users.module'; +import { ScheduleModule } from '@nestjs/schedule'; @Module({ imports: [ @@ -25,7 +26,7 @@ import { UsersModule } from './users/users.module'; }), UsersModule, AuthModule, + ScheduleModule.forRoot(), ], }) -export class AppModule { -} +export class AppModule {} diff --git a/src/auth/auth.repository.ts b/src/auth/auth.repository.ts index 1c6ffc9..cad2849 100644 --- a/src/auth/auth.repository.ts +++ b/src/auth/auth.repository.ts @@ -23,4 +23,19 @@ export class AuthRepository { console.log('error...'); } } + + async updateExpoToken(user: { + loginId: string; + password: string; + expoToken: string; + }) { + const { loginId, password, expoToken } = user; + return this.usersModel.findOneAndUpdate( + { + loginId, + password, + }, + { expoToken: expoToken }, + ); + } } diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 329f082..ac9d5ae 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -9,7 +9,7 @@ export class AuthService { private readonly authRepository: AuthRepository, ) {} - async login(user: { loginId: string; password: string }) { + async login(user: { loginId: string; password: string; expoToken: string }) { console.log(user); const userAccounts = this.authRepository.findByLoginIdAndPassword(user); return userAccounts @@ -17,6 +17,9 @@ export class AuthService { if (res.length === 0) { throw `계정 정보가 없습니다. 입력하신 loginId: ${user.loginId}, password: ${user.password}`; } + + this.authRepository.updateExpoToken(user); + const userByFindFirst = res[0]; const payload = { username: userByFindFirst.username, diff --git a/src/buildings/buildings.repository.ts b/src/buildings/buildings.repository.ts index d49e8d9..f9e9d8b 100644 --- a/src/buildings/buildings.repository.ts +++ b/src/buildings/buildings.repository.ts @@ -106,4 +106,13 @@ export class BuildingsRepository { console.error(err); } } + + async getAll() { + try { + return await this.buildingModel.find({}).exec(); + } catch (err) { + console.log('error... get All'); + console.error(err); + } + } } diff --git a/src/buildings/floors/cans/cans.module.ts b/src/buildings/floors/cans/cans.module.ts index 07e3391..ee7d8e1 100644 --- a/src/buildings/floors/cans/cans.module.ts +++ b/src/buildings/floors/cans/cans.module.ts @@ -7,14 +7,17 @@ import { BuildingSchema, } from 'src/buildings/entities/building.entity'; import { BuildingsRepository } from 'src/buildings/buildings.repository'; +import { User, UserSchema } from '../../../users/entities/user.entity'; +import { UsersRepository } from '../../../users/users.repository'; @Module({ imports: [ MongooseModule.forFeature([ { name: Building.name, schema: BuildingSchema }, + { name: User.name, schema: UserSchema }, ]), ], controllers: [CansController], - providers: [CansService, BuildingsRepository], + providers: [CansService, BuildingsRepository, UsersRepository], }) export class CansModule {} diff --git a/src/buildings/floors/cans/cans.service.ts b/src/buildings/floors/cans/cans.service.ts index b099c85..9a392ea 100644 --- a/src/buildings/floors/cans/cans.service.ts +++ b/src/buildings/floors/cans/cans.service.ts @@ -1,9 +1,14 @@ import { Injectable } from '@nestjs/common'; import { BuildingsRepository } from 'src/buildings/buildings.repository'; +import { UsersRepository } from '../../../users/users.repository'; +import { Cron, CronExpression } from '@nestjs/schedule'; @Injectable() export class CansService { - constructor(private readonly buildingRepository: BuildingsRepository) {} + constructor( + private readonly buildingRepository: BuildingsRepository, + private readonly userRepository: UsersRepository, + ) {} createCan({ buildingNumber, @@ -40,4 +45,36 @@ export class CansService { console.log(err); }); } + + @Cron(CronExpression.EVERY_5_SECONDS) + handleCron() { + console.log('Called when the current second is 5'); + this.userRepository.getByRole('ROLE_CLEANER').then((users) => { + this.buildingRepository.getAll().then((buildings) => { + for (const building of buildings) { + for (const floor of building.floors) { + for (const user of users) { + if (user.expoToken) { + fetch('https://exp.host/--/api/v2/push/send', { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + to: user.expoToken, + title: `이건 테스트입니다`, + body: String(floor.trashCan), + }), + }) + .then(() => console.log('send!')) + .catch((err) => console.log(err)); + console.log(user); + } + } + } + } + }); + }); + } } diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts index 83ff503..21c6004 100644 --- a/src/users/entities/user.entity.ts +++ b/src/users/entities/user.entity.ts @@ -18,6 +18,9 @@ export class User { @Prop() username: string; + @Prop({ default: null }) + expoToken: string; + @Prop() role: Role; diff --git a/src/users/users.repository.ts b/src/users/users.repository.ts index 004f81e..c46c01a 100644 --- a/src/users/users.repository.ts +++ b/src/users/users.repository.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; import { User, UserDocument } from './entities/user.entity'; +import { Role } from './entities/authorities'; @Injectable() export class UsersRepository { @@ -22,4 +23,13 @@ export class UsersRepository { console.log('error...'); } } + + async getByRole(role: Role): Promise { + try { + return await this.usersModel.find({ role }); + } catch (err) { + console.log('Error get users by role:', err.message); + throw err; + } + } } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 7946cc5..9faa1df 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -16,6 +16,7 @@ export class UsersService { user.password = password; user.username = username; user.role = role; + user.expoToken = ''; await this.usersRepository.save(user); user.password = undefined;