11import * as cdk from '@aws-cdk/core' ;
2- import { Duration , RemovalPolicy } from '@aws-cdk/core' ;
32import { JProfByBotStackProps } from './JProfByBotStackProps' ;
43import * as dynamodb from '@aws-cdk/aws-dynamodb' ;
54import * as lambda from '@aws-cdk/aws-lambda' ;
65import * as apigateway from '@aws-cdk/aws-apigateway' ;
6+ import * as sfn from '@aws-cdk/aws-stepfunctions' ;
7+ import * as tasks from '@aws-cdk/aws-stepfunctions-tasks' ;
78
89export class JProfByBotStack extends cdk . Stack {
910 constructor ( scope : cdk . Construct , id : string , props : JProfByBotStackProps ) {
@@ -13,35 +14,84 @@ export class JProfByBotStack extends cdk.Stack {
1314 tableName : 'jprof-by-bot-table-votes' ,
1415 partitionKey : { name : 'id' , type : dynamodb . AttributeType . STRING } ,
1516 billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
16- removalPolicy : RemovalPolicy . DESTROY ,
17+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
1718 } ) ;
1819 const youtubeChannelsWhitelistTable = new dynamodb . Table ( this , 'jprof-by-bot-table-youtube-channels-whitelist' , {
1920 tableName : 'jprof-by-bot-table-youtube-channels-whitelist' ,
2021 partitionKey : { name : 'id' , type : dynamodb . AttributeType . STRING } ,
2122 billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
23+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
2224 } ) ;
2325 const kotlinMentionsTable = new dynamodb . Table ( this , 'jprof-by-bot-table-kotlin-mentions' , {
2426 tableName : 'jprof-by-bot-table-kotlin-mentions' ,
2527 partitionKey : { name : 'chat' , type : dynamodb . AttributeType . NUMBER } ,
2628 billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
29+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
2730 } ) ;
2831 const dialogStatesTable = new dynamodb . Table ( this , 'jprof-by-bot-table-dialog-states' , {
2932 tableName : 'jprof-by-bot-table-dialog-states' ,
3033 partitionKey : { name : 'userId' , type : dynamodb . AttributeType . NUMBER } ,
3134 sortKey : { name : 'chatId' , type : dynamodb . AttributeType . NUMBER } ,
3235 billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
36+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
3337 } ) ;
3438 const quizojisTable = new dynamodb . Table ( this , 'jprof-by-bot-table-quizojis' , {
3539 tableName : 'jprof-by-bot-table-quizojis' ,
3640 partitionKey : { name : 'id' , type : dynamodb . AttributeType . STRING } ,
3741 billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
42+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
3843 } ) ;
3944 const moniesTable = new dynamodb . Table ( this , 'jprof-by-bot-table-monies' , {
4045 tableName : 'jprof-by-bot-table-monies' ,
4146 partitionKey : { name : 'user' , type : dynamodb . AttributeType . NUMBER } ,
4247 sortKey : { name : 'chat' , type : dynamodb . AttributeType . NUMBER } ,
4348 billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
44- removalPolicy : RemovalPolicy . DESTROY ,
49+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
50+ } ) ;
51+ const pinsTable = new dynamodb . Table ( this , 'jprof-by-bot-table-pins' , {
52+ tableName : 'jprof-by-bot-table-pins' ,
53+ partitionKey : { name : 'messageId' , type : dynamodb . AttributeType . NUMBER } ,
54+ sortKey : { name : 'chatId' , type : dynamodb . AttributeType . NUMBER } ,
55+ billingMode : dynamodb . BillingMode . PAY_PER_REQUEST ,
56+ removalPolicy : cdk . RemovalPolicy . DESTROY ,
57+ } ) ;
58+
59+ pinsTable . addGlobalSecondaryIndex ( {
60+ indexName : 'chatId' ,
61+ partitionKey : { name : 'chatId' , type : dynamodb . AttributeType . NUMBER } ,
62+ projectionType : dynamodb . ProjectionType . ALL ,
63+ } ) ;
64+ pinsTable . addGlobalSecondaryIndex ( {
65+ indexName : 'userId' ,
66+ partitionKey : { name : 'userId' , type : dynamodb . AttributeType . NUMBER } ,
67+ projectionType : dynamodb . ProjectionType . ALL ,
68+ } ) ;
69+
70+ const lambdaUnpin = new lambda . Function ( this , 'jprof-by-bot-lambda-unpin' , {
71+ functionName : 'jprof-by-bot-lambda-unpin' ,
72+ runtime : lambda . Runtime . JAVA_11 ,
73+ timeout : cdk . Duration . seconds ( 30 ) ,
74+ memorySize : 512 ,
75+ code : lambda . Code . fromAsset ( '../../pins/unpin/build/libs/jprof_by_bot-pins-unpin-all.jar' ) ,
76+ handler : 'by.jprof.telegram.bot.pins.unpin.Handler' ,
77+ environment : {
78+ 'LOG_THRESHOLD' : 'DEBUG' ,
79+ 'TABLE_PINS' : pinsTable . tableName ,
80+ 'TOKEN_TELEGRAM_BOT' : props . telegramToken ,
81+ } ,
82+ } ) ;
83+
84+ const stateMachineUnpin = new sfn . StateMachine ( this , 'jprof-by-bot-state-machine-unpin' , {
85+ stateMachineName : 'jprof-by-bot-state-machine-unpin' ,
86+ stateMachineType : sfn . StateMachineType . STANDARD ,
87+ definition : new sfn . Wait ( this , 'jprof-by-bot-state-machine-unpin-wait' , {
88+ time : sfn . WaitTime . secondsPath ( '$.ttl' ) ,
89+ } ) . next ( new tasks . LambdaInvoke ( this , 'jprof-by-bot-state-machine-unpin-unpin' , {
90+ lambdaFunction : lambdaUnpin ,
91+ invocationType : tasks . LambdaInvocationType . EVENT ,
92+ retryOnServiceExceptions : false ,
93+ } ) ) ,
94+ tracingEnabled : false ,
4595 } ) ;
4696
4797 const layerLibGL = new lambda . LayerVersion ( this , 'jprof-by-bot-lambda-layer-libGL' , {
@@ -60,7 +110,7 @@ export class JProfByBotStack extends cdk.Stack {
60110 layerLibGL ,
61111 layerLibfontconfig ,
62112 ] ,
63- timeout : Duration . seconds ( 30 ) ,
113+ timeout : cdk . Duration . seconds ( 30 ) ,
64114 memorySize : 1024 ,
65115 code : lambda . Code . fromAsset ( '../../runners/lambda/build/libs/jprof_by_bot-runners-lambda-all.jar' ) ,
66116 handler : 'by.jprof.telegram.bot.runners.lambda.JProf' ,
@@ -71,17 +121,31 @@ export class JProfByBotStack extends cdk.Stack {
71121 'TABLE_KOTLIN_MENTIONS' : kotlinMentionsTable . tableName ,
72122 'TABLE_DIALOG_STATES' : dialogStatesTable . tableName ,
73123 'TABLE_QUIZOJIS' : quizojisTable . tableName ,
124+ 'TABLE_MONIES' : moniesTable . tableName ,
125+ 'TABLE_PINS' : pinsTable . tableName ,
126+ 'STATE_MACHINE_UNPINS' : stateMachineUnpin . stateMachineArn ,
74127 'TOKEN_TELEGRAM_BOT' : props . telegramToken ,
75128 'TOKEN_YOUTUBE_API' : props . youtubeToken ,
76129 } ,
77130 } ) ;
78131
79132 votesTable . grantReadWriteData ( lambdaWebhook ) ;
133+
80134 youtubeChannelsWhitelistTable . grantReadData ( lambdaWebhook ) ;
135+
81136 kotlinMentionsTable . grantReadWriteData ( lambdaWebhook ) ;
137+
82138 dialogStatesTable . grantReadWriteData ( lambdaWebhook ) ;
139+
83140 quizojisTable . grantReadWriteData ( lambdaWebhook ) ;
84141
142+ moniesTable . grantReadWriteData ( lambdaWebhook ) ;
143+
144+ pinsTable . grantReadWriteData ( lambdaWebhook ) ;
145+ pinsTable . grantReadWriteData ( lambdaUnpin ) ;
146+
147+ stateMachineUnpin . grantStartExecution ( lambdaWebhook )
148+
85149 const api = new apigateway . RestApi ( this , 'jprof-by-bot-api' , {
86150 restApiName : 'jprof-by-bot-api' ,
87151 cloudWatchRole : false ,
0 commit comments