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
Binary file removed .DS_Store
Binary file not shown.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,5 @@
# Go workspace file
go.work

.DS_Store
.DS_Store
test.db
32 changes: 32 additions & 0 deletions common/response.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package common

import (
"net/http"

"github.com/gin-gonic/gin"
)

type requestResponse struct {
Message string `json:"message"`
Status uint `json:"status"`
}

func SuccessResponse(ctx *gin.Context, msg string) {

response := requestResponse{
msg,
http.StatusOK,
}

ctx.JSON(http.StatusOK, response)
}

func BadResponse(ctx *gin.Context, msg string) {

response := requestResponse{
msg,
http.StatusBadRequest,
}

ctx.JSON(http.StatusBadRequest, response)
}
10 changes: 9 additions & 1 deletion common/user.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
package common

type UserCreationInput struct {
FullName string `json:"full_name"`
FullName string `json:"fullName"`
Email string `json:"email"`
}
type UserUpdateInput struct {
FullName string `json:"fullName"`
Email string `json:"email"`
}

func NewUserCreationInput() *UserCreationInput {
return &UserCreationInput{}
}

func NewUserUpdateInput() *UserUpdateInput {
return &UserUpdateInput{}
}
6 changes: 3 additions & 3 deletions frontend/src/components/createUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ export default function CreateUser() {
console.log(fullName);
console.log(email);

fetch("https://jsonplaceholder.typicode.com/users", {
fetch("http://localhost:8080/api/users/", {
method: "POST",
body: JSON.stringify({
fullName,
email,
"fullName":fullName,
"email":email,
}),
headers: {
"Content-type": "application/json; charset=UTF-8",
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/components/userlist.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export default function UserList() {

function reloadUserList(event){
console.log(event);
fetch("http://localhost:8080/api/users", {
fetch("http://localhost:8080/api/users/", {
method: "GET",
headers: {
"Content-type": "application/json; charset=UTF-8",
Expand Down Expand Up @@ -40,7 +40,7 @@ export default function UserList() {
<tbody>
{
data.map((item)=>(
<User id={item.id} fullName={item.name} email={item.email} />
<User id={item.id} fullName={item.fullName} email={item.email} />
))
}
</tbody>
Expand Down
101 changes: 92 additions & 9 deletions handlers/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,36 +11,119 @@ import (

type UserHandler struct {
groupName string
userManager *managers.UserManager
userManager managers.UserManager
}

func NewUserHandlerFrom(userManager *managers.UserManager) *UserHandler {
func NewUserHandlerFrom(userManager managers.UserManager) *UserHandler {
return &UserHandler{
"api/users",
userManager,
}
}

func (userHandler *UserHandler) RegisterUserApis(r *gin.Engine) {
userGroup := r.Group(userHandler.groupName)
userGroup.POST("", userHandler.Create)
func (handler *UserHandler) RegisterUserApis(r *gin.Engine) {
userGroup := r.Group(handler.groupName)

userGroup.POST("", handler.Create)
userGroup.GET("", handler.List)
userGroup.GET(":userid/", handler.Detail)
userGroup.DELETE(":userid/", handler.Delete)
userGroup.PATCH(":userid/", handler.Update)
}

func (userHandler *UserHandler) Create(ctx *gin.Context) {
func (handler *UserHandler) Create(ctx *gin.Context) {

userData := common.NewUserCreationInput()

err := ctx.BindJSON(&userData)

if err != nil {
fmt.Println("Failed to bind data")
common.BadResponse(ctx, "Failed to bind data")
return
}

newUser, err := userHandler.userManager.Create(userData)
newUser, err := handler.userManager.Create(userData)

if err != nil {
fmt.Println("failed to create user")
common.BadResponse(ctx, "failed to create user")
return
}

ctx.JSON(http.StatusOK, newUser)
}

func (handler *UserHandler) List(ctx *gin.Context) {

allUsers, err := handler.userManager.List()

if err != nil {
common.BadResponse(ctx, "failed to get users")
return
}

ctx.JSON(http.StatusOK, allUsers)
}

func (handler *UserHandler) Detail(ctx *gin.Context) {

userId, ok := ctx.Params.Get("userid")

if !ok {
fmt.Println("invalid userid")
}
user, err := handler.userManager.Get(userId)

if user.ID == 0 {
common.BadResponse(ctx, "no user present")
return
}

if err != nil {
common.BadResponse(ctx, "failed to get user")
}

ctx.JSON(http.StatusOK, user)
}

func (handler *UserHandler) Delete(ctx *gin.Context) {

userId, ok := ctx.Params.Get("userid")

if !ok {
common.BadResponse(ctx, "invalid userid")
}
err := handler.userManager.Delete(userId)

if err != nil {
common.BadResponse(ctx, "failed to delete user")
}

common.SuccessResponse(ctx, "Deleted user")
}

func (handler *UserHandler) Update(ctx *gin.Context) {

userId, ok := ctx.Params.Get("userid")

if !ok {
common.BadResponse(ctx, "failed to delete user")
}

userData := common.NewUserUpdateInput()

err := ctx.BindJSON(&userData)

if err != nil {
common.BadResponse(ctx, "failed to bind data")
return
}

user, err := handler.userManager.Update(userId, userData)

if err != nil {
common.BadResponse(ctx, "failed to update user")
return
}

ctx.JSON(http.StatusOK, user)
}
4 changes: 2 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package main
import (
"fmt"

"github.com/buildfromzero/skill-map/database"
"github.com/buildfromzero/skill-map/handlers"
"github.com/buildfromzero/skill-map/managers"
"github.com/buildfromzero/skill-map/storage"
"github.com/gin-gonic/gin"
)

func init() {
database.Initialize()
storage.InitializeDatabase()
}

func main() {
Expand Down
53 changes: 47 additions & 6 deletions managers/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,66 @@ import (
"errors"

"github.com/buildfromzero/skill-map/common"
"github.com/buildfromzero/skill-map/database"
"github.com/buildfromzero/skill-map/models"
"github.com/buildfromzero/skill-map/storage"
)

type UserManager struct {
type UserManager interface {
Create(userData *common.UserCreationInput) (*models.User, error)
List() ([]models.User, error)
Get(id string) (models.User, error)
Update(userId string, userData *common.UserUpdateInput) (*models.User, error)
Delete(id string) error
}

type userManager struct {
// DatabaseDriver
// dbClient
}

func NewUserManager() *UserManager {
return &UserManager{}
func NewUserManager() UserManager {
return &userManager{}
}

func (userMgr *UserManager) Create(userData *common.UserCreationInput) (*models.User, error) {
func (userMgr *userManager) Create(userData *common.UserCreationInput) (*models.User, error) {
newUser := &models.User{FullName: userData.FullName, Email: userData.Email}
database.DB.Create(newUser)
storage.DB.Create(newUser)

if newUser.ID == 0 {
return nil, errors.New("user creation failed")
}

return newUser, nil
}

func (userMgr *userManager) List() ([]models.User, error) {
users := []models.User{}
storage.DB.Find(&users)
return users, nil
}

func (userMgr *userManager) Get(id string) (models.User, error) {
user := models.User{}

storage.DB.First(&user, id)

return user, nil
}

func (userMgr *userManager) Update(userId string, userData *common.UserUpdateInput) (*models.User, error) {

user := models.User{}

storage.DB.First(&user, userId)
storage.DB.Model(&user).Updates(models.User{FullName: userData.FullName, Email: userData.Email})

return &user, nil
}

func (userMgr *userManager) Delete(id string) error {
user := models.User{}

storage.DB.First(&user, id)
storage.DB.Delete(&user)
return nil
}
16 changes: 12 additions & 4 deletions models/user.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package models

import "gorm.io/gorm"
import (
"time"

"gorm.io/gorm"
)

type User struct {
gorm.Model
FullName string
Email string
// gorm.Model
ID uint `gorm:"primarykey" json:"id"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
FullName string `json:"fullName"`
Email string `json:"email"`
}
4 changes: 2 additions & 2 deletions database/db.go → storage/db.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package database
package storage

import (
"github.com/buildfromzero/skill-map/models"
Expand All @@ -8,7 +8,7 @@ import (

var DB *gorm.DB

func Initialize() {
func InitializeDatabase() {
var err error
DB, err = gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
Expand Down
Binary file removed test.db
Binary file not shown.