Skip to content

Commit f9ade06

Browse files
committed
add users lambda
1 parent 395cec0 commit f9ade06

27 files changed

+719
-37
lines changed

api-products/api/controller/product_controller_impl.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package controller
22

33
import (
44
"github.com/dieg0code/serverles-api-scraper/api/data/request"
5-
"github.com/dieg0code/serverles-api-scraper/api/data/response"
65
"github.com/dieg0code/serverles-api-scraper/api/service"
6+
"github.com/dieg0code/shared/json/response"
77
"github.com/gin-gonic/gin"
88
"github.com/sirupsen/logrus"
99
)

api-products/api/controller/product_controller_impl_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"testing"
99

1010
"github.com/dieg0code/serverles-api-scraper/api/data/request"
11-
"github.com/dieg0code/serverles-api-scraper/api/data/response"
11+
"github.com/dieg0code/shared/json/response"
1212
"github.com/gin-gonic/gin"
1313
"github.com/stretchr/testify/assert"
1414
"github.com/stretchr/testify/mock"

api-products/api/service/product_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package service
22

33
import (
44
"github.com/dieg0code/serverles-api-scraper/api/data/request"
5-
"github.com/dieg0code/serverles-api-scraper/api/data/response"
5+
"github.com/dieg0code/shared/json/response"
66
)
77

88
type ProductService interface {

api-products/api/service/product_service_impl.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55
"github.com/aws/aws-sdk-go/aws/session"
66
"github.com/aws/aws-sdk-go/service/lambda"
77
"github.com/dieg0code/serverles-api-scraper/api/data/request"
8-
"github.com/dieg0code/serverles-api-scraper/api/data/response"
98
"github.com/dieg0code/serverles-api-scraper/api/repository"
9+
"github.com/dieg0code/shared/json/response"
1010
"github.com/sirupsen/logrus"
1111
)
1212

api-products/api/service/product_service_impl_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package service
33
import (
44
"testing"
55

6-
"github.com/dieg0code/serverles-api-scraper/api/data/response"
6+
"github.com/dieg0code/shared/json/response"
77
"github.com/dieg0code/shared/models"
88
"github.com/stretchr/testify/assert"
99
"github.com/stretchr/testify/mock"
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package controllers
2+
3+
import "github.com/gin-gonic/gin"
4+
5+
type UserController interface {
6+
RegisterUser(c *gin.Context)
7+
GetAllUsers(c *gin.Context)
8+
GetUserByID(c *gin.Context)
9+
}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package controllers
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/dieg0code/api-users/services"
7+
"github.com/dieg0code/shared/json/request"
8+
"github.com/dieg0code/shared/json/response"
9+
"github.com/gin-gonic/gin"
10+
"github.com/sirupsen/logrus"
11+
)
12+
13+
type UserControllerImpl struct {
14+
userService services.UserService
15+
}
16+
17+
// GetAllUsers implements UserController.
18+
func (u *UserControllerImpl) GetAllUsers(c *gin.Context) {
19+
users, err := u.userService.GetAllUsers()
20+
if err != nil {
21+
logrus.WithError(err).Error("[UserControllerImpl.GetAllUsers] Error getting all users")
22+
errorResponse := response.BaseResponse{
23+
Code: 500,
24+
Status: "error",
25+
Message: "Error getting all users",
26+
Data: nil,
27+
}
28+
29+
c.JSON(500, errorResponse)
30+
return
31+
}
32+
33+
webResponse := response.BaseResponse{
34+
Code: 200,
35+
Status: "success",
36+
Message: "Success getting all users",
37+
Data: users,
38+
}
39+
40+
c.JSON(200, webResponse)
41+
}
42+
43+
// GetUserByID implements UserController.
44+
func (u *UserControllerImpl) GetUserByID(c *gin.Context) {
45+
userID := c.Param("userID")
46+
47+
user, err := u.userService.GetUserByID(userID)
48+
if err != nil {
49+
logrus.WithError(err).Error("[UserControllerImpl.GetUserByID] Error getting user by ID")
50+
errorResponse := response.BaseResponse{
51+
Code: 500,
52+
Status: "error",
53+
Message: "Error getting user by ID",
54+
Data: nil,
55+
}
56+
57+
c.JSON(500, errorResponse)
58+
return
59+
}
60+
61+
webResponse := response.BaseResponse{
62+
Code: 200,
63+
Status: "success",
64+
Message: "User fetched successfully",
65+
Data: user,
66+
}
67+
68+
c.JSON(200, webResponse)
69+
}
70+
71+
// RegisterUser implements UserController.
72+
func (u *UserControllerImpl) RegisterUser(c *gin.Context) {
73+
registerUserRequest := request.CreateUserRequest{}
74+
75+
err := c.ShouldBindJSON(&registerUserRequest)
76+
if err != nil {
77+
logrus.WithError(err).Error("[UserControllerImpl.RegisterUser] Error binding JSON")
78+
errorResponse := response.BaseResponse{
79+
Code: 400,
80+
Status: "error",
81+
Message: "Invalid request body",
82+
Data: nil,
83+
}
84+
85+
c.JSON(400, errorResponse)
86+
return
87+
}
88+
89+
user, err := u.userService.RegisterUser(registerUserRequest)
90+
if err != nil {
91+
logrus.WithError(err).Error("[UserControllerImpl.RegisterUser] Error registering user")
92+
errorResponse := response.BaseResponse{
93+
Code: 500,
94+
Status: "error",
95+
Message: "Error registering user",
96+
Data: nil,
97+
}
98+
99+
c.JSON(500, errorResponse)
100+
return
101+
}
102+
103+
webResponse := response.BaseResponse{
104+
Code: 201,
105+
Status: "success",
106+
Message: "User registered successfully",
107+
Data: fmt.Sprintf("User %s registered successfully ID: %s", user.Username, user.UserID),
108+
}
109+
110+
c.JSON(201, webResponse)
111+
}
112+
113+
func NewUserControllerImpl(userService services.UserService) UserController {
114+
return &UserControllerImpl{
115+
userService: userService,
116+
}
117+
}

api-users/go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module github.com/dieg0code/api-users
2+
3+
go 1.22.4

api-users/main.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package main
2+
3+
import (
4+
"context"
5+
6+
"github.com/aws/aws-lambda-go/events"
7+
"github.com/aws/aws-lambda-go/lambda"
8+
"github.com/dieg0code/api-users/controllers"
9+
"github.com/dieg0code/api-users/repository"
10+
"github.com/dieg0code/api-users/router"
11+
"github.com/dieg0code/api-users/services"
12+
"github.com/dieg0code/api-users/utils"
13+
"github.com/dieg0code/shared/db"
14+
"github.com/go-playground/validator/v10"
15+
"github.com/sirupsen/logrus"
16+
)
17+
18+
var r *router.Router
19+
20+
func init() {
21+
logrus.Info("Initializing serverless API users")
22+
23+
region := "sa-east-1"
24+
tableName := "Users"
25+
26+
// Instance Database
27+
db := db.NewDynamoDB(region)
28+
29+
// Instance repository
30+
userRepo := repository.NewUserRepositoryImpl(db, tableName)
31+
32+
validator := validator.New()
33+
passwordHaher := utils.NewPasswordHasher()
34+
35+
// Instance Service
36+
userService := services.NewUserServiceImpl(userRepo, validator, passwordHaher)
37+
38+
// Instance controller
39+
userController := controllers.NewUserControllerImpl(userService)
40+
41+
r = router.NewRouter(userController)
42+
r.InitRoutes()
43+
44+
logrus.Info("Serverless API users initialized Successfully")
45+
}
46+
47+
func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
48+
logrus.Info("Handling request:", req.Path)
49+
response, err := r.Handler(ctx, req)
50+
if err != nil {
51+
logrus.Error("Error handling request:", err)
52+
return events.APIGatewayProxyResponse{
53+
StatusCode: 500,
54+
Body: `{"error": "Internal Server Error"}`,
55+
}, err
56+
}
57+
logrus.Info("Request handled successfully")
58+
return response, nil
59+
}
60+
61+
func main() {
62+
logrus.Info("Starting serverless API users")
63+
lambda.Start(Handler)
64+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package repository
2+
3+
import "github.com/dieg0code/shared/models"
4+
5+
type UserRepository interface {
6+
GetAll() ([]models.User, error)
7+
GetByID(id string) (models.User, error)
8+
Create(user models.User) (models.User, error)
9+
}
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package repository
2+
3+
import (
4+
"errors"
5+
6+
"github.com/aws/aws-sdk-go/aws"
7+
"github.com/aws/aws-sdk-go/service/dynamodb"
8+
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
9+
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbiface"
10+
"github.com/dieg0code/shared/models"
11+
"github.com/sirupsen/logrus"
12+
)
13+
14+
type UserRepositoryImpl struct {
15+
db dynamodbiface.DynamoDBAPI
16+
tableName string
17+
}
18+
19+
// Create implements UserRepository.
20+
func (u *UserRepositoryImpl) Create(user models.User) (models.User, error) {
21+
input := &dynamodb.PutItemInput{
22+
TableName: &u.tableName,
23+
Item: map[string]*dynamodb.AttributeValue{
24+
"UserID": {
25+
S: aws.String(user.UserID),
26+
},
27+
"Username": {
28+
S: aws.String(user.Username),
29+
},
30+
"Email": {
31+
S: aws.String(user.Email),
32+
},
33+
"Password": {
34+
S: aws.String(user.Password),
35+
},
36+
"Role": {
37+
S: aws.String(user.Role),
38+
},
39+
},
40+
}
41+
42+
_, err := u.db.PutItem(input)
43+
if err != nil {
44+
logrus.WithError(err).Error("[UserRepositoryImpl.Create] error creating user")
45+
return models.User{}, errors.New("error creating user")
46+
}
47+
48+
return user, nil
49+
}
50+
51+
// GetAll implements UserRepository.
52+
func (u *UserRepositoryImpl) GetAll() ([]models.User, error) {
53+
input := &dynamodb.ScanInput{
54+
TableName: &u.tableName,
55+
}
56+
57+
result, err := u.db.Scan(input)
58+
if err != nil {
59+
logrus.WithError(err).Error("[UserRepositoryImpl.GetAll] error getting users")
60+
return nil, errors.New("error getting users")
61+
}
62+
63+
var users []models.User
64+
err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &users)
65+
if err != nil {
66+
logrus.WithError(err).Error("[UserRepositoryImpl.GetAll] error unmarshalling users")
67+
return nil, errors.New("error getting users")
68+
}
69+
70+
return users, nil
71+
}
72+
73+
// GetByID implements UserRepository.
74+
func (u *UserRepositoryImpl) GetByID(id string) (models.User, error) {
75+
input := &dynamodb.GetItemInput{
76+
TableName: &u.tableName,
77+
Key: map[string]*dynamodb.AttributeValue{
78+
"UserID": {
79+
S: aws.String(id),
80+
},
81+
},
82+
}
83+
84+
result, err := u.db.GetItem(input)
85+
if err != nil {
86+
logrus.WithError(err).Error("[UserRepositoryImpl.GetByID] error getting user")
87+
return models.User{}, errors.New("error getting user")
88+
}
89+
90+
if result.Item == nil {
91+
return models.User{}, errors.New("user not found")
92+
}
93+
94+
var user models.User
95+
err = dynamodbattribute.UnmarshalMap(result.Item, &user)
96+
if err != nil {
97+
logrus.WithError(err).Error("[UserRepositoryImpl.GetByID] error unmarshalling user")
98+
return models.User{}, errors.New("error getting user")
99+
}
100+
101+
return user, nil
102+
}
103+
104+
func NewUserRepositoryImpl(db dynamodbiface.DynamoDBAPI, tableName string) UserRepository {
105+
return &UserRepositoryImpl{
106+
db: db,
107+
tableName: tableName,
108+
}
109+
}

0 commit comments

Comments
 (0)