Skip to content

Commit ffb0f01

Browse files
committed
feat change styles
1 parent 6a58281 commit ffb0f01

26 files changed

Lines changed: 745 additions & 110 deletions

File tree

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@ build:
22
GOOS=linux GOARCH=arm64 go build -o build/main cmd/main.go
33
test:
44
go test ./...
5+
6+
sync:
7+
browser-sync start --proxy "http://localhost:8080" --files "**/*.gotmpl"

application/adapters/gitlab_adapter.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ func NewGitlabAdapter(
2525
}
2626

2727
func (ga *GitlabAuthAdapter) SignIn(ctx context.Context, code string) (dtos.GithubResponse, *utils.RestErr) {
28-
2928
if code == "" {
3029
return dtos.GithubResponse{}, utils.NewBadRequestException(utils.CODE_AUTHETICATION_MISSGIN)
3130
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dtos
2+
3+
type CreateUserInputDto struct {
4+
Email string `json:"email" validate:"requried,email"`
5+
Name string `json:"username" validate:"required,email"`
6+
Password string `json:"password" validate:"required"`
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package dtos
2+
3+
type LoginInputDto struct {
4+
Email string `json:"email" binding:"required"`
5+
Password string `json:"password" binding:"required"`
6+
}

application/http/controllers/login_controller.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"net/http"
55
"os"
66

7+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/dtos"
78
"github.com/IcaroSilvaFK/developer_academy_mvc/application/http/views"
89
"github.com/IcaroSilvaFK/developer_academy_mvc/application/services"
910
"github.com/IcaroSilvaFK/developer_academy_mvc/application/utils"
@@ -81,9 +82,26 @@ func (c *LoginController) SignIn(ctx *gin.Context) {
8182
code := ctx.Param("code")
8283
provider := ctx.Query("provider")
8384

84-
if code == "" {
85-
err := utils.NewBadRequestException("Missing a param code in request")
86-
ctx.JSON(err.Code, err)
85+
if code == "" && ctx.Request.Method == "POST" {
86+
input := new(dtos.LoginInputDto)
87+
88+
if err := ctx.ShouldBindJSON(input); err != nil {
89+
errno := utils.NewBadRequestException(err.Error())
90+
ctx.JSON(errno.Code, errno)
91+
return
92+
}
93+
94+
r, err := c.svc.LoginWithPassword(ctx.Request.Context(), input)
95+
96+
if err != nil {
97+
ctx.JSON(err.Code, err)
98+
return
99+
}
100+
u := views.NewUserResponseView(r)
101+
102+
c.sessionservice.Set(ctx, "user", u)
103+
104+
ctx.JSON(http.StatusOK, u)
87105
return
88106
}
89107
goContext := ctx.Request.Context()
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package controllers
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/dtos"
7+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/http/views"
8+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/services"
9+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/utils"
10+
"github.com/gin-gonic/gin"
11+
)
12+
13+
type UserController struct {
14+
svc services.UserServiceInterface
15+
}
16+
17+
type UserControllerInterface interface {
18+
CreateUser(*gin.Context)
19+
}
20+
21+
func NewUserController(
22+
svc services.UserServiceInterface,
23+
) UserControllerInterface {
24+
return &UserController{
25+
svc,
26+
}
27+
}
28+
29+
func (u *UserController) CreateUser(c *gin.Context) {
30+
ctx := c.Request.Context()
31+
32+
input := new(dtos.CreateUserInputDto)
33+
34+
if err := c.ShouldBindJSON(input); err != nil {
35+
errno := utils.NewBadRequestException(err.Error())
36+
37+
c.JSON(errno.Code, errno)
38+
return
39+
}
40+
41+
r, err := u.svc.CreateUser(ctx, input)
42+
43+
if err != nil {
44+
c.JSON(err.Code, err)
45+
return
46+
}
47+
48+
user := views.NewUserResponseView(r)
49+
50+
c.JSON(http.StatusCreated, user)
51+
return
52+
}

application/routes/api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func NewApiRoutes(engine *gin.Engine) {
2727
})
2828
})
2929

30-
group.GET("/login/:code", loginController.SignIn)
30+
group.Any("/login/:code", loginController.SignIn)
3131

3232
// CHALLENGES
3333
group.POST("/challenges", authMiddleware, createChallengeController.Create)

application/services/auth_service.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package services
22

33
import (
44
"context"
5+
"time"
56

67
"github.com/IcaroSilvaFK/developer_academy_mvc/application/adapters"
8+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/dtos"
79
"github.com/IcaroSilvaFK/developer_academy_mvc/application/utils"
810
"github.com/IcaroSilvaFK/developer_academy_mvc/infra/models"
911
"github.com/IcaroSilvaFK/developer_academy_mvc/infra/repositories"
@@ -18,6 +20,7 @@ type LoginService struct {
1820

1921
type LoginServiceInterface interface {
2022
Login(ctx context.Context, code, provider string) (*models.UserModel, *utils.RestErr)
23+
LoginWithPassword(ctx context.Context, dto *dtos.LoginInputDto) (*models.UserModel, *utils.RestErr)
2124
}
2225

2326
func NewAuthService(
@@ -53,7 +56,7 @@ func (a *LoginService) Login(ctx context.Context, code, provider string) (*model
5356
}
5457
if err == gorm.ErrRecordNotFound {
5558
uExists = models.NewUserModel(
56-
u.Email, u.Name, u.AvatarUrl, u.Url, u.Bio,
59+
u.Email, u.Name, u.AvatarUrl, u.Url, u.Bio, nil,
5760
)
5861
err = a.ur.Create(ctx, uExists)
5962

@@ -85,3 +88,21 @@ func (s *LoginService) getProvider(provider string) adapters.AdapterAuthInterfac
8588
}
8689
}
8790
}
91+
92+
func (a *LoginService) LoginWithPassword(ctx context.Context, dto *dtos.LoginInputDto) (*models.UserModel, *utils.RestErr) {
93+
user, err := a.ur.FindByEmail(ctx, dto.Email)
94+
95+
if err != nil {
96+
message := "Error on find user"
97+
return nil, utils.NewInternalServerError(&message)
98+
}
99+
100+
if !user.VerifyPassword(dto.Password) {
101+
return nil, utils.NewBadRequestException("Email or password invalid")
102+
}
103+
104+
// this is for brute force atack
105+
time.Sleep(2 * time.Second)
106+
107+
return user, nil
108+
}

application/services/user_service.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
"github.com/IcaroSilvaFK/developer_academy_mvc/application/dtos"
78
"github.com/IcaroSilvaFK/developer_academy_mvc/application/utils"
89
"github.com/IcaroSilvaFK/developer_academy_mvc/infra/models"
910
"github.com/IcaroSilvaFK/developer_academy_mvc/infra/repositories"
@@ -19,6 +20,7 @@ type UserServiceInterface interface {
1920
FindAllUsers(context.Context) ([]*models.UserModel, *utils.RestErr)
2021
FindUserById(context.Context, string) (*models.UserModel, *utils.RestErr)
2122
Delete(context.Context, string) *utils.RestErr
23+
CreateUser(context.Context, *dtos.CreateUserInputDto) (*models.UserModel, *utils.RestErr)
2224
}
2325

2426
func NewUserService(
@@ -30,6 +32,18 @@ func NewUserService(
3032
}
3133
}
3234

35+
func (us *UserService) CreateUser(ctx context.Context, dto *dtos.CreateUserInputDto) (*models.UserModel, *utils.RestErr) {
36+
u := models.NewUserModel(dto.Email, dto.Name, "https://cataas.com/cat", "", "Hello, start here with your bio!", &dto.Password)
37+
38+
err := us.ur.Create(ctx, u)
39+
40+
if err != nil {
41+
return nil, utils.NewInternalServerError(nil)
42+
}
43+
44+
return u, nil
45+
}
46+
3347
func (us *UserService) GetTenFirstUserAndCount(ctx context.Context) ([]*models.UserModel, int, *utils.RestErr) {
3448

3549
u, c, err := us.ur.FindFirstTenAndCount(ctx)

go.mod

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
module github.com/IcaroSilvaFK/developer_academy_mvc
22

3-
go 1.22.0
3+
go 1.23.0
4+
5+
toolchain go1.23.7
46

57
require (
68
github.com/gin-contrib/sessions v0.0.5
79
github.com/gin-gonic/gin v1.10.0
810
github.com/glebarez/sqlite v1.11.0
911
github.com/google/uuid v1.6.0
1012
github.com/joho/godotenv v1.5.1
13+
github.com/matthewhartstonge/argon2 v1.2.0
1114
github.com/redis/go-redis/v9 v9.5.1
1215
github.com/sashabaranov/go-openai v1.20.4
1316
github.com/stretchr/testify v1.9.0
@@ -65,11 +68,11 @@ require (
6568
github.com/ugorji/go/codec v1.2.12 // indirect
6669
go.uber.org/multierr v1.10.0 // indirect
6770
golang.org/x/arch v0.8.0 // indirect
68-
golang.org/x/crypto v0.23.0 // indirect
71+
golang.org/x/crypto v0.36.0 // indirect
6972
golang.org/x/net v0.25.0 // indirect
70-
golang.org/x/sys v0.20.0 // indirect
71-
golang.org/x/text v0.15.0 // indirect
72-
golang.org/x/tools v0.21.0 // indirect
73+
golang.org/x/sys v0.31.0 // indirect
74+
golang.org/x/text v0.23.0 // indirect
75+
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
7376
google.golang.org/protobuf v1.34.1 // indirect
7477
gopkg.in/yaml.v3 v3.0.1 // indirect
7578
modernc.org/libc v1.22.5 // indirect

0 commit comments

Comments
 (0)