Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions controllers/dto/users_dto.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dto

type User struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
}
42 changes: 32 additions & 10 deletions controllers/users_controller.go
Original file line number Diff line number Diff line change
@@ -1,40 +1,62 @@
package controllers

import (
"context"
"fmt"
"github.com/gin-gonic/gin"
"github.com/laironacosta/ms-gin-go/controllers/dto"
"github.com/laironacosta/ms-gin-go/services"
"net/http"
)

type User struct {
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
type UserControllerInterface interface {
Create(c *gin.Context)
GetByEmail(c *gin.Context)
UpdateByEmail(c *gin.Context)
DeleteByEmail(c *gin.Context)
}

func Create(c *gin.Context) {
u := User{}
type UserController struct {
userService services.UserServiceInterface
}

func NewUserController(userService services.UserServiceInterface) UserControllerInterface {
return &UserController{
userService,
}
}

func (ctr *UserController) Create(c *gin.Context) {
u := dto.User{}
if err := c.ShouldBindJSON(&u); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}

if err := ctr.userService.Create(context.Background(), u); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}

fmt.Printf("Request received: %+v \n", u)
c.JSON(http.StatusOK, gin.H{"message": "created"})
}

func GetByEmail(c *gin.Context) {
func (ctr *UserController) GetByEmail(c *gin.Context) {
e := c.Param("email")

fmt.Printf("Path param received: %+v \n", e)
c.JSON(http.StatusOK, User{
c.JSON(http.StatusOK, dto.User{
Email: e,
})
}

func UpdateByEmail(c *gin.Context) {
u := User{}
func (ctr *UserController) UpdateByEmail(c *gin.Context) {
u := dto.User{}
if err := c.ShouldBindJSON(&u); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
Expand All @@ -49,7 +71,7 @@ func UpdateByEmail(c *gin.Context) {
c.JSON(http.StatusOK, u)
}

func DeleteByEmail(c *gin.Context) {
func (ctr *UserController) DeleteByEmail(c *gin.Context) {
e := c.Param("email")

fmt.Printf("Path param received: %+v \n", e)
Expand Down
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ module github.com/laironacosta/ms-gin-go
go 1.16

require (
github.com/Lairon/db-go v0.0.0-20210328034946-ed191835cebb
github.com/gin-gonic/gin v1.6.3
github.com/go-pg/pg/v10 v10.9.0
github.com/go-playground/validator/v10 v10.4.1 // indirect
github.com/golang/protobuf v1.5.1 // indirect
github.com/json-iterator/go v1.1.10 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/ugorji/go v1.2.4 // indirect
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect
golang.org/x/sys v0.0.0-20210326220804-49726bf1d181 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
155 changes: 152 additions & 3 deletions go.sum

Large diffs are not rendered by default.

26 changes: 23 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,30 @@
package main

import (
"github.com/laironacosta/ms-gin-go/routes"
"github.com/Lairon/db-go/pgdb"
"github.com/gin-gonic/gin"
"github.com/go-pg/pg/v10"
"github.com/laironacosta/ms-gin-go/controllers"
repo "github.com/laironacosta/ms-gin-go/repository"
"github.com/laironacosta/ms-gin-go/router"
"github.com/laironacosta/ms-gin-go/services"
)

func main() {
r := routes.NewRouter()
r.Run() // listen and serve on 0.0.0.0:8080
gin := gin.Default()

db := pgdb.NewPgDB(&pg.Options{
User: "postgres",
Password: "postgres",
Database: "pg-db-go",
})

userRepo := repo.NewUserRepository(db)
userService := services.NewUserService(userRepo)
userController := controllers.NewUserController(userService)

r := router.NewRouter(gin, userController)
r.Init()

gin.Run() // listen and serve on 0.0.0.0:8080
}
40 changes: 40 additions & 0 deletions repository/users_repository.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package repository

import (
"context"
"github.com/go-pg/pg/v10"
"github.com/laironacosta/ms-gin-go/controllers/dto"
)

type UserRepositoryInterface interface {
Create(ctx context.Context, user dto.User) error
GetByEmail(ctx context.Context, email string) (*dto.User, error)
UpdateByEmail(ctx context.Context, email string) error
DeleteByEmail(ctx context.Context, email string) error
}

type UserRepository struct {
DB *pg.DB
}

func NewUserRepository(db *pg.DB) UserRepositoryInterface {
return &UserRepository{
db,
}
}

func (r *UserRepository) Create(ctx context.Context, user dto.User) error {
return nil
}

func (r *UserRepository) GetByEmail(ctx context.Context, email string) (*dto.User, error) {
return &dto.User{}, nil
}

func (r *UserRepository) UpdateByEmail(ctx context.Context, email string) error {
return nil
}

func (r *UserRepository) DeleteByEmail(ctx context.Context, email string) error {
return nil
}
34 changes: 34 additions & 0 deletions router/router.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package router

import (
"github.com/gin-gonic/gin"
"github.com/laironacosta/ms-gin-go/controllers"
)

type Router struct {
server *gin.Engine
userController controllers.UserControllerInterface
}

func NewRouter(server *gin.Engine, userController controllers.UserControllerInterface) *Router {
return &Router{
server,
userController,
}
}

func (r *Router) Init() {
//create a default router with default middleware
basePath := r.server.Group("/ms-gin-go")

basePath.GET("/health", controllers.Health)

users := basePath.Group("/users")
{
users.POST("/", r.userController.Create)
users.GET("/:email", r.userController.GetByEmail)
users.PUT("/:email", r.userController.UpdateByEmail)
users.PATCH("/:email", r.userController.UpdateByEmail)
users.DELETE("/:email", r.userController.DeleteByEmail)
}
}
26 changes: 0 additions & 26 deletions routes/router.go

This file was deleted.

53 changes: 53 additions & 0 deletions services/users_service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package services

import (
"context"
"github.com/laironacosta/ms-gin-go/controllers/dto"
repo "github.com/laironacosta/ms-gin-go/repository"
)

type UserServiceInterface interface {
Create(ctx context.Context, user dto.User) error
GetByEmail(ctx context.Context, email string) (*dto.User, error)
UpdateByEmail(ctx context.Context, email string) error
DeleteByEmail(ctx context.Context, email string) error
}

type UserService struct {
userRepo repo.UserRepositoryInterface
}

func NewUserService(userRepo repo.UserRepositoryInterface) UserServiceInterface {
return &UserService{
userRepo,
}
}

func (s *UserService) Create(ctx context.Context, user dto.User) error {
if err := s.userRepo.Create(ctx, user); err != nil {
return err
}
return nil
}

func (s *UserService) GetByEmail(ctx context.Context, email string) (*dto.User, error) {
u, err := s.userRepo.GetByEmail(ctx, email)
if err != nil {
return &dto.User{}, err
}
return u, nil
}

func (s *UserService) UpdateByEmail(ctx context.Context, email string) error {
if err := s.userRepo.UpdateByEmail(ctx, email); err != nil {
return err
}
return nil
}

func (s *UserService) DeleteByEmail(ctx context.Context, email string) error {
if err := s.userRepo.UpdateByEmail(ctx, email); err != nil {
return err
}
return nil
}