From e58663381938d8c804f617829367bf5bcad90098 Mon Sep 17 00:00:00 2001 From: k013600 Date: Thu, 7 Sep 2023 21:30:41 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=B0=A9=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=8B=9C=20=EC=8A=AC=EB=9E=99=20=EC=95=8C=EB=A6=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/api/rooms/rooms.module.ts | 3 +- src/api/rooms/rooms.service.ts | 8 +- src/app.module.ts | 5 +- src/config/slackbotConfig.ts | 6 ++ src/slackbot/slackbot.controller.ts | 13 +++ src/slackbot/slackbot.module.ts | 11 +++ src/slackbot/slackbot.service.ts | 21 +++++ yarn.lock | 123 +++++++++++++++++++++++++++- 9 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 src/config/slackbotConfig.ts create mode 100644 src/slackbot/slackbot.controller.ts create mode 100644 src/slackbot/slackbot.module.ts create mode 100644 src/slackbot/slackbot.service.ts diff --git a/package.json b/package.json index 500f2e4..c7556bf 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@nestjs/passport": "^10.0.0", "@nestjs/platform-express": "^9.0.0", "@prisma/client": "4.16.1", + "@slack/web-api": "^6.9.0", "bcrypt": "^5.1.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", diff --git a/src/api/rooms/rooms.module.ts b/src/api/rooms/rooms.module.ts index 12f9743..10f3a1e 100644 --- a/src/api/rooms/rooms.module.ts +++ b/src/api/rooms/rooms.module.ts @@ -1,12 +1,13 @@ import { Module } from '@nestjs/common'; import { PrismaModule } from '@/prisma/prisma.module'; +import { SlackbotModule } from '@/slackbot/slackbot.module'; import { RoomsService } from './rooms.service'; import { RoomsController } from './rooms.controller'; @Module({ - imports: [PrismaModule], + imports: [PrismaModule, SlackbotModule], controllers: [RoomsController], providers: [RoomsService], exports: [RoomsService], diff --git a/src/api/rooms/rooms.service.ts b/src/api/rooms/rooms.service.ts index f127ad5..d9f8343 100644 --- a/src/api/rooms/rooms.service.ts +++ b/src/api/rooms/rooms.service.ts @@ -9,6 +9,7 @@ import uniq from 'lodash/uniq'; import { customAlphabet } from 'nanoid'; import { PrismaService } from '@/prisma/prisma.service'; +import { SlackbotService } from '@/slackbot/slackbot.service'; import { CreateRoomDto } from './dto/create-room.dto'; @@ -16,7 +17,10 @@ const nanoid = customAlphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', 6); @Injectable() export class RoomsService { - constructor(private readonly prismaService: PrismaService) {} + constructor( + private readonly slackbotService: SlackbotService, + private readonly prismaService: PrismaService + ) {} private convertStringToDate(stringDate: string): Date { return new Date(stringDate); @@ -57,7 +61,7 @@ export class RoomsService { */ async create(createRoomDto: CreateRoomDto): Promise { this.validateDates(createRoomDto); - + this.slackbotService.sendSlackCreateRoomNotific(); return this.prismaService.room.create({ data: { code: nanoid(), diff --git a/src/app.module.ts b/src/app.module.ts index 4000911..8b41b64 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,19 +7,22 @@ import { PrismaModule } from '@/prisma/prisma.module'; import { HealthModule } from '@/health/health.module'; import { AuthModule } from './api/auth/auth.module'; +import { SlackbotModule } from './slackbot/slackbot.module'; import authConfig from './config/authConfig'; +import slackbotConfig from './config/slackbotConfig'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, - load: [authConfig], + load: [authConfig, slackbotConfig], }), PrismaModule, RoomsModule, UsersModule, AuthModule, HealthModule, + SlackbotModule, ], controllers: [], providers: [], diff --git a/src/config/slackbotConfig.ts b/src/config/slackbotConfig.ts new file mode 100644 index 0000000..3dcb571 --- /dev/null +++ b/src/config/slackbotConfig.ts @@ -0,0 +1,6 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs('slackbot', () => ({ + slackbotTk: process.env.SLACKBOT_TOKEN, + slackbotUserTk: process.env.SLACK_USER_TOKEN, +})); diff --git a/src/slackbot/slackbot.controller.ts b/src/slackbot/slackbot.controller.ts new file mode 100644 index 0000000..8a254da --- /dev/null +++ b/src/slackbot/slackbot.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get } from '@nestjs/common'; + +import { SlackbotService } from './slackbot.service'; + +@Controller('slackbot') +export class SlackbotController { + constructor(private readonly slackbotService: SlackbotService) {} + + @Get('test') + sendSlackCreateRoomNotific() { + return this.slackbotService.sendSlackCreateRoomNotific(); + } +} diff --git a/src/slackbot/slackbot.module.ts b/src/slackbot/slackbot.module.ts new file mode 100644 index 0000000..9442e9f --- /dev/null +++ b/src/slackbot/slackbot.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; + +import { SlackbotService } from './slackbot.service'; +import { SlackbotController } from './slackbot.controller'; + +@Module({ + controllers: [SlackbotController], + providers: [SlackbotService], + exports: [SlackbotService], +}) +export class SlackbotModule {} diff --git a/src/slackbot/slackbot.service.ts b/src/slackbot/slackbot.service.ts new file mode 100644 index 0000000..d2a1820 --- /dev/null +++ b/src/slackbot/slackbot.service.ts @@ -0,0 +1,21 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ConfigType } from '@nestjs/config'; +import { WebClient } from '@slack/web-api'; +import slackbotConfig from 'src/config/slackbotConfig'; + +@Injectable() +export class SlackbotService { + constructor( + @Inject(slackbotConfig.KEY) + readonly config: ConfigType + ) {} + async sendSlackCreateRoomNotific() { + const client = new WebClient(this.config.slackbotTk); + + await client.chat.postMessage({ + channel: '#createroom-notifications', + text: `방금 새로운 약속방이 생성되었습니다!`, + }); + return; + } +} diff --git a/yarn.lock b/yarn.lock index eefe98a..19f2599 100644 --- a/yarn.lock +++ b/yarn.lock @@ -860,6 +860,35 @@ dependencies: "@sinonjs/commons" "^3.0.0" +"@slack/logger@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-3.0.0.tgz#b736d4e1c112c22a10ffab0c2d364620aedcb714" + integrity sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA== + dependencies: + "@types/node" ">=12.0.0" + +"@slack/types@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.8.0.tgz#11ea10872262a7e6f86f54e5bcd4f91e3a41fe91" + integrity sha512-ghdfZSF0b4NC9ckBA8QnQgC9DJw2ZceDq0BIjjRSv6XAZBXJdWgxIsYz0TYnWSiqsKZGH2ZXbj9jYABZdH3OSQ== + +"@slack/web-api@^6.9.0": + version "6.9.0" + resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-6.9.0.tgz#d829dcfef490dbce8e338912706b6f39dcde3ad2" + integrity sha512-RME5/F+jvQmZHkoP+ogrDbixq1Ms1mBmylzuWq4sf3f7GCpMPWoiZ+WqWk+sism3vrlveKWIgO9R4Qg9fiRyoQ== + dependencies: + "@slack/logger" "^3.0.0" + "@slack/types" "^2.8.0" + "@types/is-stream" "^1.1.0" + "@types/node" ">=12.0.0" + axios "^0.27.2" + eventemitter3 "^3.1.0" + form-data "^2.5.0" + is-electron "2.2.2" + is-stream "^1.1.0" + p-queue "^6.6.1" + p-retry "^4.0.0" + "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" @@ -981,6 +1010,13 @@ dependencies: "@types/node" "*" +"@types/is-stream@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/is-stream/-/is-stream-1.1.0.tgz#b84d7bb207a210f2af9bed431dc0fbe9c4143be1" + integrity sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -1050,6 +1086,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== +"@types/node@>=12.0.0": + version "20.5.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.9.tgz#a70ec9d8fa0180a314c3ede0e20ea56ff71aed9a" + integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -1094,6 +1135,11 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/semver@^7.3.12": version "7.5.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" @@ -1605,6 +1651,14 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + babel-jest@^29.5.0: version "29.5.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" @@ -2023,7 +2077,7 @@ colorette@^2.0.19: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -combined-stream@^1.0.8: +combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -2609,6 +2663,16 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -2834,6 +2898,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +follow-redirects@^1.14.9: + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -2859,6 +2928,15 @@ fork-ts-checker-webpack-plugin@8.0.0: semver "^7.3.5" tapable "^2.2.1" +form-data@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -3365,6 +3443,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-electron@2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3434,6 +3517,11 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -4554,6 +4642,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4589,6 +4682,29 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-queue@^6.6.1: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + +p-retry@^4.0.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -4962,6 +5078,11 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" From c367ad3c8362f6e31c1469926ee6e0e7680ba193 Mon Sep 17 00:00:00 2001 From: k013600 Date: Thu, 7 Sep 2023 21:32:06 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=ED=95=98?= =?UTF-8?q?=EB=8D=98=20=EC=BD=94=EB=93=9C=EB=A5=BC=20=EC=95=88=EC=A7=80?= =?UTF-8?q?=EC=9B=A0=EB=84=A4=EC=9A=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/slackbot/slackbot.controller.ts | 13 ------------- src/slackbot/slackbot.module.ts | 2 -- 2 files changed, 15 deletions(-) delete mode 100644 src/slackbot/slackbot.controller.ts diff --git a/src/slackbot/slackbot.controller.ts b/src/slackbot/slackbot.controller.ts deleted file mode 100644 index 8a254da..0000000 --- a/src/slackbot/slackbot.controller.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; - -import { SlackbotService } from './slackbot.service'; - -@Controller('slackbot') -export class SlackbotController { - constructor(private readonly slackbotService: SlackbotService) {} - - @Get('test') - sendSlackCreateRoomNotific() { - return this.slackbotService.sendSlackCreateRoomNotific(); - } -} diff --git a/src/slackbot/slackbot.module.ts b/src/slackbot/slackbot.module.ts index 9442e9f..5995a6b 100644 --- a/src/slackbot/slackbot.module.ts +++ b/src/slackbot/slackbot.module.ts @@ -1,10 +1,8 @@ import { Module } from '@nestjs/common'; import { SlackbotService } from './slackbot.service'; -import { SlackbotController } from './slackbot.controller'; @Module({ - controllers: [SlackbotController], providers: [SlackbotService], exports: [SlackbotService], }) From 3a32becaf0ba48646d8b1b80d694600b6791990f Mon Sep 17 00:00:00 2001 From: k013600 Date: Thu, 7 Sep 2023 21:48:21 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=EC=B1=84=EB=84=90=20=EB=AA=85=20env?= =?UTF-8?q?=20=ED=8C=8C=EC=9D=BC=EC=97=90=20=EB=84=A3=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/config/slackbotConfig.ts | 1 + src/slackbot/slackbot.module.ts | 2 ++ src/slackbot/slackbot.service.ts | 14 +++++++++++++- yarn.lock | 20 ++++++++++++++++++++ 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index c7556bf..4504681 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@nestjs/mapped-types": "*", "@nestjs/passport": "^10.0.0", "@nestjs/platform-express": "^9.0.0", + "@nestjs/schedule": "^3.0.3", "@prisma/client": "4.16.1", "@slack/web-api": "^6.9.0", "bcrypt": "^5.1.0", diff --git a/src/config/slackbotConfig.ts b/src/config/slackbotConfig.ts index 3dcb571..7c5477d 100644 --- a/src/config/slackbotConfig.ts +++ b/src/config/slackbotConfig.ts @@ -3,4 +3,5 @@ import { registerAs } from '@nestjs/config'; export default registerAs('slackbot', () => ({ slackbotTk: process.env.SLACKBOT_TOKEN, slackbotUserTk: process.env.SLACK_USER_TOKEN, + slackbotReportChannel: process.env.SLACKBOT_REPORT_CHANNEL, })); diff --git a/src/slackbot/slackbot.module.ts b/src/slackbot/slackbot.module.ts index 5995a6b..ea86e2e 100644 --- a/src/slackbot/slackbot.module.ts +++ b/src/slackbot/slackbot.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common'; +import { ScheduleModule } from '@nestjs/schedule'; import { SlackbotService } from './slackbot.service'; @Module({ + imports: [ScheduleModule.forRoot()], providers: [SlackbotService], exports: [SlackbotService], }) diff --git a/src/slackbot/slackbot.service.ts b/src/slackbot/slackbot.service.ts index d2a1820..d03200c 100644 --- a/src/slackbot/slackbot.service.ts +++ b/src/slackbot/slackbot.service.ts @@ -2,6 +2,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { ConfigType } from '@nestjs/config'; import { WebClient } from '@slack/web-api'; import slackbotConfig from 'src/config/slackbotConfig'; +import { Cron, CronExpression } from '@nestjs/schedule'; @Injectable() export class SlackbotService { @@ -13,9 +14,20 @@ export class SlackbotService { const client = new WebClient(this.config.slackbotTk); await client.chat.postMessage({ - channel: '#createroom-notifications', + channel: this.config.slackbotReportChannel, text: `방금 새로운 약속방이 생성되었습니다!`, }); return; } + + @Cron('0 0 * * *') // 매일 자정에 실행 + async sendDailyRoomCount() { + const client = new WebClient(this.config.slackbotTk); + const dailyRoomCount = 0; + + await client.chat.postMessage({ + channel: this.config.slackbotReportChannel, + text: `오늘 하루 총 방 생성 개수는 ${dailyRoomCount}개입니다.`, + }); + } } diff --git a/yarn.lock b/yarn.lock index 19f2599..95b7f9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -777,6 +777,14 @@ multer "1.4.4-lts.1" tslib "2.5.2" +"@nestjs/schedule@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@nestjs/schedule/-/schedule-3.0.3.tgz#b9fdb5a3d765676a3238077c882b8fe2336772ec" + integrity sha512-xsMA4dmP3LcW3rt2iMPfm88bDbCj/hLuDsLrKmJQlbnxyCYtBwLtmu/4cSfZELLM7pTDT+E8QDAqGwhYyUUjxg== + dependencies: + cron "2.4.1" + uuid "9.0.0" + "@nestjs/schematics@^9.0.0", "@nestjs/schematics@^9.0.4": version "9.2.0" resolved "https://registry.yarnpkg.com/@nestjs/schematics/-/schematics-9.2.0.tgz#f840054b5ae4b0b4e70aa9f72c09c3cf388f2512" @@ -2195,6 +2203,13 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cron@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/cron/-/cron-2.4.1.tgz#90000398576beb3787339a1b3131f336aed10771" + integrity sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w== + dependencies: + luxon "^3.2.1" + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4241,6 +4256,11 @@ lru-cache@^9.1.1: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== +luxon@^3.2.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.3.tgz#8ddf0358a9492267ffec6a13675fbaab5551315d" + integrity sha512-tFWBiv3h7z+T/tDaoxA8rqTxy1CHV6gHS//QdaH4pulbq/JuBSGgQspQQqcgnwdAx6pNI7cmvz5Sv/addzHmUg== + macos-release@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" From 1e75eefc44b78387874f239eea6223b14540bfdd Mon Sep 17 00:00:00 2001 From: k013600 Date: Thu, 7 Sep 2023 22:01:55 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=EC=9E=90=EC=A0=95=EB=A7=88?= =?UTF-8?q?=EB=8B=A4=20=EC=98=A4=EB=8A=98=20=EC=83=9D=EC=84=B1=EB=90=9C=20?= =?UTF-8?q?=EB=B0=A9=20=EA=B0=9C=EC=88=98=20=EC=95=8C=EB=A6=BC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/slackbot/slackbot.controller.ts | 13 +++++++++++++ src/slackbot/slackbot.module.ts | 6 +++++- src/slackbot/slackbot.service.ts | 30 ++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/slackbot/slackbot.controller.ts diff --git a/src/slackbot/slackbot.controller.ts b/src/slackbot/slackbot.controller.ts new file mode 100644 index 0000000..93e0774 --- /dev/null +++ b/src/slackbot/slackbot.controller.ts @@ -0,0 +1,13 @@ +import { Controller, Get } from '@nestjs/common'; + +import { SlackbotService } from './slackbot.service'; + +@Controller('slackbot') +export class SlackbotController { + constructor(private readonly slackbotService: SlackbotService) {} + + @Get('test') + sendSlackCreateRoomNotific() { + return this.slackbotService.sendDailyRoomCount(); + } +} diff --git a/src/slackbot/slackbot.module.ts b/src/slackbot/slackbot.module.ts index ea86e2e..c570cce 100644 --- a/src/slackbot/slackbot.module.ts +++ b/src/slackbot/slackbot.module.ts @@ -1,10 +1,14 @@ import { Module } from '@nestjs/common'; import { ScheduleModule } from '@nestjs/schedule'; +import { PrismaModule } from '@/prisma/prisma.module'; + import { SlackbotService } from './slackbot.service'; +import { SlackbotController } from './slackbot.controller'; @Module({ - imports: [ScheduleModule.forRoot()], + controllers: [SlackbotController], + imports: [PrismaModule, ScheduleModule.forRoot()], providers: [SlackbotService], exports: [SlackbotService], }) diff --git a/src/slackbot/slackbot.service.ts b/src/slackbot/slackbot.service.ts index d03200c..118d049 100644 --- a/src/slackbot/slackbot.service.ts +++ b/src/slackbot/slackbot.service.ts @@ -2,14 +2,38 @@ import { Inject, Injectable } from '@nestjs/common'; import { ConfigType } from '@nestjs/config'; import { WebClient } from '@slack/web-api'; import slackbotConfig from 'src/config/slackbotConfig'; -import { Cron, CronExpression } from '@nestjs/schedule'; +import { Cron } from '@nestjs/schedule'; + +import { PrismaService } from '@/prisma/prisma.service'; @Injectable() export class SlackbotService { constructor( @Inject(slackbotConfig.KEY) - readonly config: ConfigType + readonly config: ConfigType, + private readonly prismaService: PrismaService ) {} + private async getTodayRoomCount(): Promise { + // 오늘 날짜의 시작과 끝 시간을 구합니다. + const startOfDay = new Date(); + startOfDay.setHours(0, 0, 0, 0); + + const endOfDay = new Date(); + endOfDay.setHours(23, 59, 59, 999); + + // Prisma를 사용하여 해당 범위에 있는 레코드의 개수를 검색합니다. + const count = await this.prismaService.room.count({ + where: { + createdAt: { + gte: startOfDay, + lte: endOfDay, + }, + }, + }); + + return count; + } + async sendSlackCreateRoomNotific() { const client = new WebClient(this.config.slackbotTk); @@ -23,7 +47,7 @@ export class SlackbotService { @Cron('0 0 * * *') // 매일 자정에 실행 async sendDailyRoomCount() { const client = new WebClient(this.config.slackbotTk); - const dailyRoomCount = 0; + const dailyRoomCount = await this.getTodayRoomCount(); await client.chat.postMessage({ channel: this.config.slackbotReportChannel, From 30c1889a6fbe190ea05e53c4598fc3bac28c89bb Mon Sep 17 00:00:00 2001 From: k013600 Date: Thu, 7 Sep 2023 22:11:51 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=ED=95=9C=EA=B5=AD=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EB=8C=80=20=EA=B3=A0=EB=A0=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/slackbot/slackbot.controller.ts | 13 ------------- src/slackbot/slackbot.module.ts | 2 -- src/slackbot/slackbot.service.ts | 10 +++++++--- yarn.lock | 12 ++++++++++++ 5 files changed, 20 insertions(+), 18 deletions(-) delete mode 100644 src/slackbot/slackbot.controller.ts diff --git a/package.json b/package.json index 4504681..af5e6c8 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,7 @@ "date-fns": "^2.30.0", "lodash": "^4.17.21", "nanoid": "^3.3.6", + "node-cron": "^3.0.2", "passport": "^0.6.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", diff --git a/src/slackbot/slackbot.controller.ts b/src/slackbot/slackbot.controller.ts deleted file mode 100644 index 93e0774..0000000 --- a/src/slackbot/slackbot.controller.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; - -import { SlackbotService } from './slackbot.service'; - -@Controller('slackbot') -export class SlackbotController { - constructor(private readonly slackbotService: SlackbotService) {} - - @Get('test') - sendSlackCreateRoomNotific() { - return this.slackbotService.sendDailyRoomCount(); - } -} diff --git a/src/slackbot/slackbot.module.ts b/src/slackbot/slackbot.module.ts index c570cce..d85a8b4 100644 --- a/src/slackbot/slackbot.module.ts +++ b/src/slackbot/slackbot.module.ts @@ -4,10 +4,8 @@ import { ScheduleModule } from '@nestjs/schedule'; import { PrismaModule } from '@/prisma/prisma.module'; import { SlackbotService } from './slackbot.service'; -import { SlackbotController } from './slackbot.controller'; @Module({ - controllers: [SlackbotController], imports: [PrismaModule, ScheduleModule.forRoot()], providers: [SlackbotService], exports: [SlackbotService], diff --git a/src/slackbot/slackbot.service.ts b/src/slackbot/slackbot.service.ts index 118d049..410c6c0 100644 --- a/src/slackbot/slackbot.service.ts +++ b/src/slackbot/slackbot.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { ConfigType } from '@nestjs/config'; import { WebClient } from '@slack/web-api'; import slackbotConfig from 'src/config/slackbotConfig'; -import { Cron } from '@nestjs/schedule'; +import * as cron from 'node-cron'; import { PrismaService } from '@/prisma/prisma.service'; @@ -12,7 +12,12 @@ export class SlackbotService { @Inject(slackbotConfig.KEY) readonly config: ConfigType, private readonly prismaService: PrismaService - ) {} + ) { + // 한국 시간에 맞춰서 매일 자정에 sendDailyRoomCount 함수를 실행합니다. + cron.schedule('0 0 * * *', this.sendDailyRoomCount.bind(this), { + timezone: 'Asia/Seoul', + }); + } private async getTodayRoomCount(): Promise { // 오늘 날짜의 시작과 끝 시간을 구합니다. const startOfDay = new Date(); @@ -44,7 +49,6 @@ export class SlackbotService { return; } - @Cron('0 0 * * *') // 매일 자정에 실행 async sendDailyRoomCount() { const client = new WebClient(this.config.slackbotTk); const dailyRoomCount = await this.getTodayRoomCount(); diff --git a/yarn.lock b/yarn.lock index 95b7f9d..bc639b3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4493,6 +4493,13 @@ node-addon-api@^5.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== +node-cron@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.2.tgz#bb0681342bd2dfb568f28e464031280e7f06bd01" + integrity sha512-iP8l0yGlNpE0e6q1o185yOApANRe47UPbLf4YxfbiNHt/RU5eBcGB/e0oudruheSf+LQeDMezqC5BVAb5wwRcQ== + dependencies: + uuid "8.3.2" + node-emoji@1.11.0: version "1.11.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" @@ -5807,6 +5814,11 @@ utils-merge@1.0.1, utils-merge@^1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + uuid@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"