Skip to content

Commit

Permalink
feat: Search users
Browse files Browse the repository at this point in the history
  • Loading branch information
Woynert committed Oct 25, 2023
1 parent 8bc9043 commit 4c4e84e
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 6 deletions.
40 changes: 39 additions & 1 deletion controller/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package controller
import (
"bitroll/codefest1-users/model"
"context"
"golang.org/x/crypto/bcrypt"
"time"

"golang.org/x/crypto/bcrypt"
)

func (ctrl *Controller) Register(req model.ReqRegister) error {
Expand Down Expand Up @@ -75,3 +76,40 @@ func (ctrl *Controller) RegisterTeacher(req model.ReqRegisterTeacher) error {

return nil
}

func (ctrl *Controller) SearchUser(req model.ReqSearchUser) ([]model.UserSearchResult, error) {

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

query := `
SELECT uuid, username FROM Users WHERE username LIKE CONCAT('%', CAST($1 as VARCHAR(50)), '%')
`

rows, err := ctrl.DB.QueryContext(
ctx,
query,
req.Query,
)
if err != nil {
return nil, err
}
defer rows.Close()

// iterate results

var users []model.UserSearchResult

for rows.Next() {
var user model.UserSearchResult
if err := rows.Scan(&user.UUID, &user.Username); err != nil {
return nil, err
}
users = append(users, user)
}
if err = rows.Err(); err != nil {
return nil, err
}

return users, nil
}
2 changes: 1 addition & 1 deletion docs/bruno-users/environments/development.bru
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
vars {
BASE_URL: http://127.0.0.1:8080
BASE_URL: http://127.0.0.1:8081
API_PATH: api/v1
}
18 changes: 18 additions & 0 deletions docs/bruno-users/friends/search_user.bru
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
meta {
name: search_user
type: http
seq: 1
}

post {
url: {{BASE_URL}}/{{API_PATH}}/user/search
body: json
auth: none
}

body:json {
{
"query": "ert",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDIzLTEwLTI1VDE2OjIwOjU5Ljk5MDgzODUzNy0wNTowMCIsIm5iZiI6IjIwMjMtMTAtMjVUMTY6MTA6NTkuOTkwODM2MTQ0LTA1OjAwIiwidXNlcmlkIjoiMDcyOGQ0YjYtM2ExOS00ZWI4LWI3YTEtNTkwN2JiNzQ2NWNiIn0.XRDMsfkox7VVvNETq1sjaGT8XiOsvV6wYT4ATilzMpU"
}
}
8 changes: 8 additions & 0 deletions model/controller_resp.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package model

import "github.com/google/uuid"

type UserSearchResult struct {
Username string
UUID uuid.UUID
}
7 changes: 6 additions & 1 deletion model/requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,16 @@ type ReqRegister struct {
}

type ReqRegisterTeacher struct {
Token string `json:"token" validate:"required"`
Username string `json:"username" validate:"required"`
Email string `json:"email" validate:"required,email"`
Fullname string `json:"fullname" validate:"required"`
Password string `json:"password" validate:"required,min=8"`
Token string `json:"token" validate:"required"`
}

type ReqSearchUser struct {
Token string `json:"token" validate:"required"`
Query string `json:"query" validate:"required,min=3"`
}

// session
Expand Down
1 change: 1 addition & 0 deletions router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ func SetupRouter(ctrl *controller.Controller) Router {
user := base.Group("/user")
user.POST("/register", r.Register)
user.POST("/register_teacher", r.RegisterTeacher)
user.POST("/search", r.SearchUser)

sess := base.Group("/session")
sess.POST("/login", r.Login)
Expand Down
37 changes: 34 additions & 3 deletions router/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ func (r *Router) RegisterTeacher(ctx *gin.Context) {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.MsgBadRequest())
return
}
if err := r.validator.Struct(req); err != nil {
ctx.JSON(http.StatusBadRequest, model.MsgValidationErr(err.Error()))
return
}

// validate access token

Expand All @@ -52,18 +56,45 @@ func (r *Router) RegisterTeacher(ctx *gin.Context) {
return
}

// validate struct
if err := r.ctrl.RegisterTeacher(req); err != nil {
log.Println(err)
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.MsgIntServerErr())
return
}

ctx.JSON(http.StatusOK, gin.H{"msg": "User registered"})
}

func (r *Router) SearchUser(ctx *gin.Context) {

// validate

var req model.ReqSearchUser
if err := ctx.BindJSON(&req); err != nil {
log.Println(err)
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.MsgBadRequest())
return
}
if err := r.validator.Struct(req); err != nil {
ctx.JSON(http.StatusBadRequest, model.MsgValidationErr(err.Error()))
return
}

if err := r.ctrl.RegisterTeacher(req); err != nil {
// validate access token

err, _ := ValidateToken(req.Token, []byte(config.Cfg.Secret))
if err != nil {
log.Println(err)
ctx.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"message": "Invalid access token"})
return
}

users, err := r.ctrl.SearchUser(req)
if err != nil {
log.Println(err)
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.MsgIntServerErr())
return
}

ctx.JSON(http.StatusOK, gin.H{"msg": "User registered"})
ctx.JSON(http.StatusOK, gin.H{"msg": "User registered", "users": users})
}

0 comments on commit 4c4e84e

Please sign in to comment.