Skip to content

Commit 2c8f841

Browse files
committed
fix compile error; progress in metadata cronjob add query
1 parent d816fe6 commit 2c8f841

File tree

4 files changed

+64
-29
lines changed

4 files changed

+64
-29
lines changed

lambda_golang/cmd/landing_metadata_cronjob/main.go

+3-7
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,12 @@ type LambdaResponse struct {
3636
}
3737

3838
func HandleRequest(ctx context.Context, s3Event events.S3Event) (LambdaResponse, error) {
39-
40-
// TODO: create a cronjob rule in tf
41-
// TODO: point cronjob to this func
42-
43-
// TODO: change from s3Event to fetch from dynamoDB (query)
39+
items := cloud.DynamoDBQueryWaitingMetadata(ctx, newssite.DOCTYPE_LANDING)
4440

4541
GoTools.Logger("INFO", "Landing page metadata.json generator launched")
4642

47-
for _, record := range s3Event.Records {
48-
landingPageS3Key := record.S3.Object.URLDecodedKey
43+
for _, landingItem := range *items {
44+
landingPageS3Key := landingItem.S3Key
4945
GoTools.Logger("INFO", fmt.Sprintf("Captured landing page at %s", landingPageS3Key))
5046

5147
landingPageHtmlText := cloud.Pull(landingPageS3Key)

lambda_golang/cmd/landing_s3_trigger/main.go

+5-11
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ import (
1616
//"github.com/aws/aws-sdk-go-v2/config"
1717
//"github.com/aws/aws-sdk-go-v2/service/sqs"
1818

19-
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
20-
2119
// local packages
2220
"github.com/rivernews/media-literacy/pkg/cloud"
2321
"github.com/rivernews/media-literacy/pkg/newssite"
@@ -43,21 +41,17 @@ func HandleRequest(ctx context.Context, s3Event events.S3Event) (LambdaResponse,
4341
landingPageS3Key := record.S3.Object.URLDecodedKey
4442
GoTools.Logger("INFO", fmt.Sprintf("Captured landing page at %s", landingPageS3Key))
4543

46-
// remember to configure permissions in tf
47-
48-
// TODO: let landing s3 trigger switch to point to this func
49-
50-
out := cloud.DynamoDBPutItem(ctx, map[string]any{
51-
"s3Key": landingPageS3Key,
52-
"docType": string(newssite.DOCTYPE_LANDING),
53-
"events": []newssite.MediaTableItemEvent{
44+
out := cloud.DynamoDBPutItem(ctx, newssite.MediaTableItem{
45+
S3Key: landingPageS3Key,
46+
DocType: newssite.DOCTYPE_LANDING,
47+
Events: []newssite.MediaTableItemEvent{
5448
{
5549
EventName: newssite.EVENT_LANDING_PAGE_FETCHED,
5650
Detail: fmt.Sprintf("Landing page html stored in S3 and triggers event to store in media table"),
5751
EventTime: newssite.Now(),
5852
},
5953
},
60-
"isDocTypeWaitingForMetadata": &types.AttributeValueMemberS{Value: string(newssite.DOCTYPE_LANDING)},
54+
IsDocTypeWaitingForMetadata: newssite.DOCTYPE_LANDING,
6155
})
6256

6357
GoTools.Logger("DEBUG", fmt.Sprintf("```%s```\n", GoTools.AsJson(out)))

lambda_golang/pkg/cloud/dynamodb_common.go

+40-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"github.com/aws/aws-sdk-go-v2/aws"
88
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
99
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
10+
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
1011
"github.com/rivernews/GoTools"
12+
"github.com/rivernews/media-literacy/pkg/newssite"
1113

1214
"github.com/google/uuid"
1315
)
@@ -24,27 +26,30 @@ func SharedDynamoDBClient() *dynamodb.Client {
2426
return dynamoDBClient
2527
}
2628

27-
func DynamoDBPutItem(ctx context.Context, item map[string]any) *dynamodb.PutItemOutput {
29+
func getTableName() string {
2830
tableID := GoTools.GetEnvVarHelper("DYNAMODB_TABLE_ID")
2931
if tableID == "" {
3032
GoTools.Logger("ERROR", "DYNAMODB_TABLE_ID is required please set this env var")
3133
}
34+
return tableID
35+
}
3236

33-
if _, exist := item["uuid"]; !exist {
34-
item["uuid"] = uuid.New().String()
37+
func DynamoDBPutItem(ctx context.Context, item any) *dynamodb.PutItemOutput {
38+
dynamoDBItem, err := attributevalue.MarshalMap(item)
39+
if err != nil {
40+
GoTools.Logger("ERROR", err.Error())
3541
}
3642

37-
if _, exist := item["createdAt"]; !exist {
38-
// TODO
43+
if _, exist := dynamoDBItem["uuid"]; !exist {
44+
dynamoDBItem["uuid"] = uuid.New().String()
3945
}
4046

41-
dynamoDBItem, err := attributevalue.MarshalMap(item)
42-
if err != nil {
43-
GoTools.Logger("ERROR", err.Error())
47+
if _, exist := dynamoDBItem["createdAt"]; !exist {
48+
dynamoDBItem["createdAt"] = newssite.Now()
4449
}
4550

4651
out, err := dynamoDBClient.PutItem(ctx, &dynamodb.PutItemInput{
47-
TableName: aws.String(tableID),
52+
TableName: aws.String(getTableName()),
4853
Item: dynamoDBItem,
4954
})
5055

@@ -54,3 +59,29 @@ func DynamoDBPutItem(ctx context.Context, item map[string]any) *dynamodb.PutItem
5459

5560
return out
5661
}
62+
63+
func DynamoDBQueryWaitingMetadata(ctx context.Context, docType newssite.DocType) *[]newssite.MediaTableItem {
64+
out, err := dynamoDBClient.Query(ctx, &dynamodb.QueryInput{
65+
TableName: aws.String(getTableName()),
66+
IndexName: aws.String(string(newssite.METADATA_INDEX)),
67+
KeyConditionExpression: aws.String("isDocTypeWaitingForMetadata = :isDocTypeWaitingForMetadata and createdAt < :createdAt"),
68+
ExpressionAttributeValues: map[string]types.AttributeValue{
69+
":isDocTypeWaitingForMetadata": &types.AttributeValueMemberS{Value: string(docType)},
70+
":createdAt": &types.AttributeValueMemberS{Value: newssite.Now()},
71+
},
72+
})
73+
if err != nil {
74+
GoTools.Logger("ERROR", err.Error())
75+
}
76+
77+
var results []newssite.MediaTableItem
78+
attributevalue.UnmarshalListOfMaps(out.Items, &results)
79+
80+
return &results
81+
}
82+
83+
func DynamoDBUpdateItem() {
84+
// TODO: remove attribute
85+
86+
// TODO: add event to `events`
87+
}

lambda_golang/pkg/newssite/table.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package newssite
33
type EventName string
44

55
const (
6-
// `landing`
7-
EVENT_LANDING_PAGE_REQUESTED EventName = "LANDING_PAGE_REQUESTED" ✅ 📩
6+
// `landing` ✅ 📩
7+
EVENT_LANDING_PAGE_REQUESTED EventName = "LANDING_PAGE_REQUESTED"
88
// +`landing_s3_trigger` (put in db) ✅
99
EVENT_LANDING_PAGE_FETCHED EventName = "LANDING_PAGE_FETCHED"
1010
// @`landing_metadata` -> `landing_metadata_cronjob` (query db; store metadata) ✅ (cronjob trigger) ✅
@@ -29,4 +29,18 @@ type DocType string
2929

3030
const (
3131
DOCTYPE_LANDING DocType = "LANDING"
32+
DOCTYPE_STORY DocType = "STORY"
3233
)
34+
35+
type TableIndex string
36+
37+
const (
38+
METADATA_INDEX TableIndex = "metadataIndex"
39+
)
40+
41+
type MediaTableItem struct {
42+
S3Key string `json:"s3Key"`
43+
DocType DocType `json:"docType"`
44+
Events []MediaTableItemEvent `json:"events"`
45+
IsDocTypeWaitingForMetadata DocType `json:"isDocTypeWaitingForMetadata,omitempty"`
46+
}

0 commit comments

Comments
 (0)