Skip to content

Commit 73c75dd

Browse files
authored
Merge pull request #20 from JavaBy/feature/pins
Pins
2 parents 35d980a + 9a40b1d commit 73c75dd

File tree

84 files changed

+11010
-10754
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+11010
-10754
lines changed
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
#!/usr/bin/env node
22
import 'source-map-support/register';
33
import * as cdk from '@aws-cdk/core';
4-
import { JProfByBotStack } from '../lib/JProfByBotStack';
4+
import {JProfByBotStack} from '../lib/JProfByBotStack';
55

66
if (process.env.TOKEN_TELEGRAM_BOT == null) {
7-
throw new Error('Undefined TOKEN_TELEGRAM_BOT')
7+
throw new Error('Undefined TOKEN_TELEGRAM_BOT')
88
}
99

1010
if (process.env.TOKEN_YOUTUBE_API == null) {
11-
throw new Error('Undefined TOKEN_YOUTUBE_API')
11+
throw new Error('Undefined TOKEN_YOUTUBE_API')
1212
}
1313

1414
const app = new cdk.App();
1515
new JProfByBotStack(
16-
app,
17-
'JProfByBotStack',
18-
{
19-
telegramToken: process.env.TOKEN_TELEGRAM_BOT,
20-
youtubeToken: process.env.TOKEN_YOUTUBE_API,
21-
env: {
22-
region: 'us-east-1'
16+
app,
17+
'JProfByBotStack',
18+
{
19+
telegramToken: process.env.TOKEN_TELEGRAM_BOT,
20+
youtubeToken: process.env.TOKEN_YOUTUBE_API,
21+
env: {
22+
region: 'us-east-1'
23+
}
2324
}
24-
}
2525
);
Lines changed: 162 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,169 @@
11
import * as cdk from '@aws-cdk/core';
2-
import { Duration, RemovalPolicy } from '@aws-cdk/core';
3-
import { JProfByBotStackProps } from './JProfByBotStackProps';
2+
import {JProfByBotStackProps} from './JProfByBotStackProps';
43
import * as dynamodb from '@aws-cdk/aws-dynamodb';
54
import * as lambda from '@aws-cdk/aws-lambda';
65
import * 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

89
export class JProfByBotStack extends cdk.Stack {
9-
constructor(scope: cdk.Construct, id: string, props: JProfByBotStackProps) {
10-
super(scope, id, props);
11-
12-
const votesTable = new dynamodb.Table(this, 'jprof-by-bot-table-votes', {
13-
tableName: 'jprof-by-bot-table-votes',
14-
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
15-
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
16-
removalPolicy: RemovalPolicy.DESTROY,
17-
});
18-
const youtubeChannelsWhitelistTable = new dynamodb.Table(this, 'jprof-by-bot-table-youtube-channels-whitelist', {
19-
tableName: 'jprof-by-bot-table-youtube-channels-whitelist',
20-
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
21-
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
22-
});
23-
const kotlinMentionsTable = new dynamodb.Table(this, 'jprof-by-bot-table-kotlin-mentions', {
24-
tableName: 'jprof-by-bot-table-kotlin-mentions',
25-
partitionKey: { name: 'chat', type: dynamodb.AttributeType.NUMBER },
26-
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
27-
});
28-
const dialogStatesTable = new dynamodb.Table(this, 'jprof-by-bot-table-dialog-states', {
29-
tableName: 'jprof-by-bot-table-dialog-states',
30-
partitionKey: { name: 'userId', type: dynamodb.AttributeType.NUMBER },
31-
sortKey: { name: 'chatId', type: dynamodb.AttributeType.NUMBER },
32-
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
33-
});
34-
const quizojisTable = new dynamodb.Table(this, 'jprof-by-bot-table-quizojis', {
35-
tableName: 'jprof-by-bot-table-quizojis',
36-
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
37-
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
38-
});
39-
40-
const layerLibGL = new lambda.LayerVersion(this, 'jprof-by-bot-lambda-layer-libGL', {
41-
code: lambda.Code.fromAsset('layers/libGL.zip'),
42-
compatibleRuntimes: [lambda.Runtime.JAVA_11],
43-
});
44-
const layerLibfontconfig = new lambda.LayerVersion(this, 'jprof-by-bot-lambda-layer-libfontconfig', {
45-
code: lambda.Code.fromAsset('layers/libfontconfig.zip'),
46-
compatibleRuntimes: [lambda.Runtime.JAVA_11],
47-
});
48-
49-
const lambdaWebhook = new lambda.Function(this, 'jprof-by-bot-lambda-webhook', {
50-
functionName: 'jprof-by-bot-lambda-webhook',
51-
runtime: lambda.Runtime.JAVA_11,
52-
layers: [
53-
layerLibGL,
54-
layerLibfontconfig,
55-
],
56-
timeout: Duration.seconds(30),
57-
memorySize: 1024,
58-
code: lambda.Code.fromAsset('../../runners/lambda/build/libs/jprof_by_bot-runners-lambda-all.jar'),
59-
handler: 'by.jprof.telegram.bot.runners.lambda.JProf',
60-
environment: {
61-
'LOG_THRESHOLD': 'DEBUG',
62-
'TABLE_VOTES': votesTable.tableName,
63-
'TABLE_YOUTUBE_CHANNELS_WHITELIST': youtubeChannelsWhitelistTable.tableName,
64-
'TABLE_KOTLIN_MENTIONS': kotlinMentionsTable.tableName,
65-
'TABLE_DIALOG_STATES': dialogStatesTable.tableName,
66-
'TABLE_QUIZOJIS': quizojisTable.tableName,
67-
'TOKEN_TELEGRAM_BOT': props.telegramToken,
68-
'TOKEN_YOUTUBE_API': props.youtubeToken,
69-
},
70-
});
71-
72-
votesTable.grantReadWriteData(lambdaWebhook);
73-
youtubeChannelsWhitelistTable.grantReadData(lambdaWebhook);
74-
kotlinMentionsTable.grantReadWriteData(lambdaWebhook);
75-
dialogStatesTable.grantReadWriteData(lambdaWebhook);
76-
quizojisTable.grantReadWriteData(lambdaWebhook);
77-
78-
const api = new apigateway.RestApi(this, 'jprof-by-bot-api', {
79-
restApiName: 'jprof-by-bot-api',
80-
cloudWatchRole: false,
81-
endpointTypes: [apigateway.EndpointType.REGIONAL],
82-
deployOptions: {
83-
loggingLevel: apigateway.MethodLoggingLevel.INFO,
84-
dataTraceEnabled: true,
85-
metricsEnabled: true,
86-
tracingEnabled: true,
87-
},
88-
});
89-
90-
api.root
91-
.addResource(props.telegramToken.replace(':', '_'))
92-
.addMethod('POST', new apigateway.LambdaIntegration(lambdaWebhook));
93-
94-
new cdk.CfnOutput(this, 'URL', {
95-
value: api.deploymentStage.urlForPath()
96-
});
97-
}
10+
constructor(scope: cdk.Construct, id: string, props: JProfByBotStackProps) {
11+
super(scope, id, props);
12+
13+
const votesTable = new dynamodb.Table(this, 'jprof-by-bot-table-votes', {
14+
tableName: 'jprof-by-bot-table-votes',
15+
partitionKey: {name: 'id', type: dynamodb.AttributeType.STRING},
16+
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
17+
removalPolicy: cdk.RemovalPolicy.DESTROY,
18+
});
19+
const youtubeChannelsWhitelistTable = new dynamodb.Table(this, 'jprof-by-bot-table-youtube-channels-whitelist', {
20+
tableName: 'jprof-by-bot-table-youtube-channels-whitelist',
21+
partitionKey: {name: 'id', type: dynamodb.AttributeType.STRING},
22+
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
23+
removalPolicy: cdk.RemovalPolicy.DESTROY,
24+
});
25+
const kotlinMentionsTable = new dynamodb.Table(this, 'jprof-by-bot-table-kotlin-mentions', {
26+
tableName: 'jprof-by-bot-table-kotlin-mentions',
27+
partitionKey: {name: 'chat', type: dynamodb.AttributeType.NUMBER},
28+
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
29+
removalPolicy: cdk.RemovalPolicy.DESTROY,
30+
});
31+
const dialogStatesTable = new dynamodb.Table(this, 'jprof-by-bot-table-dialog-states', {
32+
tableName: 'jprof-by-bot-table-dialog-states',
33+
partitionKey: {name: 'userId', type: dynamodb.AttributeType.NUMBER},
34+
sortKey: {name: 'chatId', type: dynamodb.AttributeType.NUMBER},
35+
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
36+
removalPolicy: cdk.RemovalPolicy.DESTROY,
37+
});
38+
const quizojisTable = new dynamodb.Table(this, 'jprof-by-bot-table-quizojis', {
39+
tableName: 'jprof-by-bot-table-quizojis',
40+
partitionKey: {name: 'id', type: dynamodb.AttributeType.STRING},
41+
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
42+
removalPolicy: cdk.RemovalPolicy.DESTROY,
43+
});
44+
const moniesTable = new dynamodb.Table(this, 'jprof-by-bot-table-monies', {
45+
tableName: 'jprof-by-bot-table-monies',
46+
partitionKey: {name: 'user', type: dynamodb.AttributeType.NUMBER},
47+
sortKey: {name: 'chat', type: dynamodb.AttributeType.NUMBER},
48+
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
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,
95+
});
96+
97+
const layerLibGL = new lambda.LayerVersion(this, 'jprof-by-bot-lambda-layer-libGL', {
98+
code: lambda.Code.fromAsset('layers/libGL.zip'),
99+
compatibleRuntimes: [lambda.Runtime.JAVA_11],
100+
});
101+
const layerLibfontconfig = new lambda.LayerVersion(this, 'jprof-by-bot-lambda-layer-libfontconfig', {
102+
code: lambda.Code.fromAsset('layers/libfontconfig.zip'),
103+
compatibleRuntimes: [lambda.Runtime.JAVA_11],
104+
});
105+
106+
const lambdaWebhook = new lambda.Function(this, 'jprof-by-bot-lambda-webhook', {
107+
functionName: 'jprof-by-bot-lambda-webhook',
108+
runtime: lambda.Runtime.JAVA_11,
109+
layers: [
110+
layerLibGL,
111+
layerLibfontconfig,
112+
],
113+
timeout: cdk.Duration.seconds(30),
114+
memorySize: 1024,
115+
code: lambda.Code.fromAsset('../../runners/lambda/build/libs/jprof_by_bot-runners-lambda-all.jar'),
116+
handler: 'by.jprof.telegram.bot.runners.lambda.JProf',
117+
environment: {
118+
'LOG_THRESHOLD': 'DEBUG',
119+
'TABLE_VOTES': votesTable.tableName,
120+
'TABLE_YOUTUBE_CHANNELS_WHITELIST': youtubeChannelsWhitelistTable.tableName,
121+
'TABLE_KOTLIN_MENTIONS': kotlinMentionsTable.tableName,
122+
'TABLE_DIALOG_STATES': dialogStatesTable.tableName,
123+
'TABLE_QUIZOJIS': quizojisTable.tableName,
124+
'TABLE_MONIES': moniesTable.tableName,
125+
'TABLE_PINS': pinsTable.tableName,
126+
'STATE_MACHINE_UNPINS': stateMachineUnpin.stateMachineArn,
127+
'TOKEN_TELEGRAM_BOT': props.telegramToken,
128+
'TOKEN_YOUTUBE_API': props.youtubeToken,
129+
},
130+
});
131+
132+
votesTable.grantReadWriteData(lambdaWebhook);
133+
134+
youtubeChannelsWhitelistTable.grantReadData(lambdaWebhook);
135+
136+
kotlinMentionsTable.grantReadWriteData(lambdaWebhook);
137+
138+
dialogStatesTable.grantReadWriteData(lambdaWebhook);
139+
140+
quizojisTable.grantReadWriteData(lambdaWebhook);
141+
142+
moniesTable.grantReadWriteData(lambdaWebhook);
143+
144+
pinsTable.grantReadWriteData(lambdaWebhook);
145+
pinsTable.grantReadWriteData(lambdaUnpin);
146+
147+
stateMachineUnpin.grantStartExecution(lambdaWebhook)
148+
149+
const api = new apigateway.RestApi(this, 'jprof-by-bot-api', {
150+
restApiName: 'jprof-by-bot-api',
151+
cloudWatchRole: false,
152+
endpointTypes: [apigateway.EndpointType.REGIONAL],
153+
deployOptions: {
154+
loggingLevel: apigateway.MethodLoggingLevel.INFO,
155+
dataTraceEnabled: true,
156+
metricsEnabled: true,
157+
tracingEnabled: true,
158+
},
159+
});
160+
161+
api.root
162+
.addResource(props.telegramToken.replace(':', '_'))
163+
.addMethod('POST', new apigateway.LambdaIntegration(lambdaWebhook));
164+
165+
new cdk.CfnOutput(this, 'URL', {
166+
value: api.deploymentStage.urlForPath()
167+
});
168+
}
98169
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as cdk from '@aws-cdk/core';
22

33
export interface JProfByBotStackProps extends cdk.StackProps {
4-
readonly telegramToken: string;
5-
readonly youtubeToken: string;
4+
readonly telegramToken: string;
5+
readonly youtubeToken: string;
66
}

0 commit comments

Comments
 (0)