-
Notifications
You must be signed in to change notification settings - Fork 12
/
handler.js
117 lines (100 loc) · 3.35 KB
/
handler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
"use strict";
const fetch = require('node-fetch');
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB.DocumentClient();
const s3 = new AWS.S3();
const parser = require('lambda-multipart-parser');
const imageBucketName = 'sc2021b3-demoapp-0000';
const userinfoUrl = 'https://dev-9zllcerz.us.auth0.com/userinfo';
// Auth0のuserinfoエンドポイントからユーザ情報を取得
const getUserinfo = async (event) => {
try {
const response = await fetch(userinfoUrl, {
headers: {
Authorization: event.headers.authorization,
}
});
console.log(`status: ${response.status}`);
return await response.json();
} catch (error) {
console.error(error);
}
};
// GET /
// 指定されたユーザの新着投稿一覧を表示するAPI
// 対象はクエリ文字列 user で指定するが、省略した場合はログインユーザ
module.exports.get = async (event) => {
const userinfo = await getUserinfo(event);
// queryStringでuserが指定されたらそれを対象に、
// 指定されていなければログインユーザを対象にする
const target = event?.queryStringParameters?.user || userinfo.name;
// postsテーブルからユーザー名を指定して新しい順に10件取得
const posts = (await dynamodb.query({
TableName: 'posts',
KeyConditionExpression: 'username = :username',
ExpressionAttributeValues: {':username': target},
ScanIndexForward: false,
Limit: 10,
ReturnConsumedCapacity: 'INDEXES',
}).promise());
// 消費したCapacityをログ出力
console.info(`Query: table=posts consumed=${posts.ConsumedCapacity.CapacityUnits}`);
return {
statusCode: 200,
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({event, userinfo, posts: posts.Items}, null, 2),
};
};
// POST /
// 投稿API
// JSONでうけつけ、bodyをメッセージ本文としてDynamoDBに登録する。
module.exports.post = async (event) => {
const userinfo = await getUserinfo(event);
const request = await parser.parse(event);
console.log(JSON.stringify(request));
const body = request?.body;
if (!body?.length) {
return {
statusCode: 400, // Bad Request
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({event, userinfo}, null, 2),
};
}
const timestamp = Math.floor(Date.now() / 1000);
// 画像がある場合はS3に保存
let imageUrl;
if (request.files.length > 0) {
const imageFilename = `${userinfo.name}_${timestamp}`;
await s3.putObject({
Bucket: imageBucketName,
Key: imageFilename,
Body: request.files[0].content,
ContentType: 'image/jpeg', // ここ手抜きポイント
ACL: 'public-read',
}).promise();
imageUrl = `https://${imageBucketName}.s3-ap-northeast-1.amazonaws.com/${imageFilename}`;
}
const result = await dynamodb.put({
TableName: 'posts',
Item: {
username: userinfo.name,
created_at: timestamp,
body,
imageUrl,
},
ReturnConsumedCapacity: 'INDEXES',
}).promise();
// 消費したCapacityをログ出力
console.info(`Query: table=posts consumed=${result.ConsumedCapacity.CapacityUnits}`);
return {
statusCode: 200,
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({event, userinfo, imageUrl}, null, 2),
};
};