-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathmain.go
More file actions
131 lines (105 loc) · 3.64 KB
/
main.go
File metadata and controls
131 lines (105 loc) · 3.64 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package main
import (
"encoding/json"
"log"
"net/http"
"time"
"feature-flag-backend/layer/database"
"feature-flag-backend/layer/jwt"
middleware "feature-flag-backend/layer/middlewares"
"feature-flag-backend/layer/models"
"feature-flag-backend/layer/utils"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
"context"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/go-playground/validator/v10"
"github.com/google/uuid"
)
var validate *validator.Validate
func init() {
validate = validator.New()
}
func createFeatureFlag(ctx context.Context, db *dynamodb.Client, createFeatureFlagRequest utils.CreateFeatureFlagRequest) (models.FeatureFlag, error) {
featureFlag := models.FeatureFlag{
Id: uuid.New().String(),
Name: createFeatureFlagRequest.FlagName,
Description: createFeatureFlagRequest.Description,
CreatedBy: createFeatureFlagRequest.UserId,
UpdatedBy: createFeatureFlagRequest.UserId,
CreatedAt: time.Now().Unix(),
UpdatedAt: time.Now().Unix(),
Status: utils.ENABLED,
}
item, err := database.MarshalMap(featureFlag)
if err != nil {
log.Printf("Error marshalling object to DynamoDB AttributeValue: \n %v", err)
return models.FeatureFlag{}, err
}
input := &dynamodb.PutItemInput{
TableName: aws.String(utils.FEATURE_FLAG_TABLE_NAME),
Item: item,
}
_, err = db.PutItem(ctx, input)
if err != nil {
log.Printf("Error putting item to Dynamodb: \n %v", err)
return models.FeatureFlag{}, err
}
return featureFlag, nil
}
func handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
var createFeatureFlagRequest utils.CreateFeatureFlagRequest
db := database.CreateDynamoDB()
utils.CheckRequestAllowed(ctx, db, utils.ConcurrencyDisablingLambda)
corsResponse, err, passed := middleware.HandleCORS(req)
if !passed {
return corsResponse, err
}
// Use enhanced middleware with user verification (Week 2 migration)
jwtResponse, userContext, err := jwt.JWTMiddlewareWithUserVerification()(req)
if err != nil || jwtResponse.StatusCode != http.StatusOK {
return jwtResponse, err
}
if userContext == nil {
return utils.ClientError(http.StatusUnauthorized, "User context not available")
}
corsHeaders := middleware.GetCORSHeadersV1(req.Headers)
err = json.Unmarshal([]byte(req.Body), &createFeatureFlagRequest)
if err != nil {
log.Printf("Error unmarshal request body: \n %v", err)
return utils.ClientError(http.StatusUnprocessableEntity, "Error unmarshalling request body")
}
if err := validate.Struct(&createFeatureFlagRequest); err != nil {
return events.APIGatewayProxyResponse{
Body: "Check the request body passed name and description are required.",
StatusCode: http.StatusBadRequest,
Headers: corsHeaders,
}, nil
}
// Use userId from authenticated user context (Week 2 migration)
// Override any userId in request body with authenticated user
createFeatureFlagRequest.UserId = userContext.UserId
featureFlag, err := createFeatureFlag(ctx, db, createFeatureFlagRequest)
if err != nil {
log.Printf("Error while creating feature flag: \n %v ", err)
return utils.ServerError(err)
}
response := events.APIGatewayProxyResponse{
StatusCode: http.StatusCreated,
Headers: corsHeaders,
}
responseBody, err := json.Marshal(map[string]interface{}{
"message": "Created feature flag successfully",
"data": featureFlag,
})
if err != nil {
log.Printf("Error marshalling response body: %v", err)
return utils.ServerError(err)
}
response.Body = string(responseBody)
return response, nil
}
func main() {
lambda.Start(handler)
}