Refactor: merge dto, mapper and routes
This commit is contained in:
@@ -1,6 +0,0 @@
|
|||||||
package dto
|
|
||||||
|
|
||||||
type BookPostCreate struct {
|
|
||||||
Title string `json:"title" binding:"required,max=300"`
|
|
||||||
Author string `json:"author" binding:"max=100"`
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package dto
|
|
||||||
|
|
||||||
type BookSearchGet struct {
|
|
||||||
Title string `json:"title" binding:"required,max=300"`
|
|
||||||
Author string `json:"author" binding:"max=100"`
|
|
||||||
ID uint `json:"id"`
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
package dto
|
|
||||||
|
|
||||||
type BookUserGet struct {
|
|
||||||
Title string `json:"title" binding:"required,max=300"`
|
|
||||||
Author string `json:"author" binding:"max=100"`
|
|
||||||
Rating int `json:"rating" binding:"min=0,max=10"`
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package dto
|
|
||||||
|
|
||||||
type UserBookPostCreate struct {
|
|
||||||
BookID uint `json:"bookId" binding:"required"`
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package dto
|
|
||||||
|
|
||||||
type UserLogin struct {
|
|
||||||
Username string `json:"username" binding:"required,min=2,max=20"`
|
|
||||||
Password string `json:"password" binding:"required,min=6,max=100"`
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package dto
|
|
||||||
|
|
||||||
type UserSignup struct {
|
|
||||||
Username string `json:"username" binding:"required,min=2,max=20"`
|
|
||||||
Password string `json:"password" binding:"required,min=6,max=100"`
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package mapper
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func BookWsToDb(b dto.BookPostCreate, user *model.User) model.Book {
|
|
||||||
return model.Book{
|
|
||||||
Title: b.Title,
|
|
||||||
Author: b.Author,
|
|
||||||
AddedBy: *user,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package mapper
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func BookDbToWs(b *model.Book) dto.BookSearchGet {
|
|
||||||
return dto.BookSearchGet{
|
|
||||||
Title: b.Title,
|
|
||||||
Author: b.Author,
|
|
||||||
ID: b.ID,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package mapper
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func UserBookDbToWs(b *model.UserBook) dto.BookUserGet {
|
|
||||||
return dto.BookUserGet{
|
|
||||||
Title: b.Book.Title,
|
|
||||||
Author: b.Book.Author,
|
|
||||||
Rating: b.Rating,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
package mapper
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
|
||||||
)
|
|
||||||
|
|
||||||
func UserBookWsToDb(ub dto.UserBookPostCreate, user *model.User) model.UserBook {
|
|
||||||
return model.UserBook{
|
|
||||||
UserID: user.ID,
|
|
||||||
BookID: ub.BookID,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package mapper
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
|
||||||
)
|
|
||||||
|
|
||||||
func UserWsToDb(u dto.UserSignup) (model.User, error) {
|
|
||||||
user := model.User{
|
|
||||||
Name: u.Username,
|
|
||||||
Password: "",
|
|
||||||
}
|
|
||||||
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
|
|
||||||
if err != nil {
|
|
||||||
return user, err
|
|
||||||
}
|
|
||||||
user.Password = string(hashedPassword)
|
|
||||||
return user, nil
|
|
||||||
}
|
|
||||||
@@ -2,14 +2,17 @@ package routes
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/mapper"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type bookPostCreate struct {
|
||||||
|
Title string `json:"title" binding:"required,max=300"`
|
||||||
|
Author string `json:"author" binding:"max=100"`
|
||||||
|
}
|
||||||
|
|
||||||
func PostBookHandler(ac appcontext.AppContext) {
|
func PostBookHandler(ac appcontext.AppContext) {
|
||||||
var book dto.BookPostCreate
|
var book bookPostCreate
|
||||||
err := ac.C.ShouldBindJSON(&book)
|
err := ac.C.ShouldBindJSON(&book)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
@@ -20,7 +23,7 @@ func PostBookHandler(ac appcontext.AppContext) {
|
|||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bookDb := mapper.BookWsToDb(book, &user)
|
bookDb := bookWsToDb(book, &user)
|
||||||
err = ac.Db.Model(&model.Book{}).Save(&bookDb).Error
|
err = ac.Db.Model(&model.Book{}).Save(&bookDb).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
@@ -28,3 +31,11 @@ func PostBookHandler(ac appcontext.AppContext) {
|
|||||||
}
|
}
|
||||||
ac.C.String(200, "Success")
|
ac.C.String(200, "Success")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bookWsToDb(b bookPostCreate, user *model.User) model.Book {
|
||||||
|
return model.Book{
|
||||||
|
Title: b.Title,
|
||||||
|
Author: b.Author,
|
||||||
|
AddedBy: *user,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,18 +5,30 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/mapper"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type bookSearchGet struct {
|
||||||
|
Title string `json:"title" binding:"required,max=300"`
|
||||||
|
Author string `json:"author" binding:"max=100"`
|
||||||
|
ID uint `json:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
func GetSearchBooksHandler(ac appcontext.AppContext) {
|
func GetSearchBooksHandler(ac appcontext.AppContext) {
|
||||||
searchterm := ac.C.Param("searchterm")
|
searchterm := ac.C.Param("searchterm")
|
||||||
var booksDb []model.Book
|
var booksDb []model.Book
|
||||||
ac.Db.Where("LOWER(title) LIKE ?", "%"+strings.ToLower(searchterm)+"%").Find(&booksDb)
|
ac.Db.Where("LOWER(title) LIKE ?", "%"+strings.ToLower(searchterm)+"%").Find(&booksDb)
|
||||||
books := make([]dto.BookSearchGet, 0)
|
books := make([]bookSearchGet, 0)
|
||||||
for _, b := range booksDb {
|
for _, b := range booksDb {
|
||||||
books = append(books, mapper.BookDbToWs(&b))
|
books = append(books, bookDbToWs(&b))
|
||||||
}
|
}
|
||||||
ac.C.JSON(http.StatusOK, books)
|
ac.C.JSON(http.StatusOK, books)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func bookDbToWs(b *model.Book) bookSearchGet {
|
||||||
|
return bookSearchGet{
|
||||||
|
Title: b.Title,
|
||||||
|
Author: b.Author,
|
||||||
|
ID: b.ID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,12 +4,16 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/mapper"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type bookUserGet struct {
|
||||||
|
Title string `json:"title" binding:"required,max=300"`
|
||||||
|
Author string `json:"author" binding:"max=100"`
|
||||||
|
Rating int `json:"rating" binding:"min=0,max=10"`
|
||||||
|
}
|
||||||
|
|
||||||
func GetMyBooksHanderl(ac appcontext.AppContext) {
|
func GetMyBooksHanderl(ac appcontext.AppContext) {
|
||||||
var userbooks []model.UserBook
|
var userbooks []model.UserBook
|
||||||
user, err := ac.GetAuthenticatedUser()
|
user, err := ac.GetAuthenticatedUser()
|
||||||
@@ -18,9 +22,17 @@ func GetMyBooksHanderl(ac appcontext.AppContext) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
ac.Db.Preload("Book").Where("user_id = ?", user.ID).Find(&userbooks)
|
ac.Db.Preload("Book").Where("user_id = ?", user.ID).Find(&userbooks)
|
||||||
booksDto := make([]dto.BookUserGet, 0)
|
booksDto := make([]bookUserGet, 0)
|
||||||
for _, userbook := range userbooks {
|
for _, userbook := range userbooks {
|
||||||
booksDto = append(booksDto, mapper.UserBookDbToWs(&userbook))
|
booksDto = append(booksDto, userBookDbToWs(&userbook))
|
||||||
}
|
}
|
||||||
ac.C.JSON(http.StatusOK, booksDto)
|
ac.C.JSON(http.StatusOK, booksDto)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func userBookDbToWs(b *model.UserBook) bookUserGet {
|
||||||
|
return bookUserGet{
|
||||||
|
Title: b.Book.Title,
|
||||||
|
Author: b.Book.Author,
|
||||||
|
Rating: b.Rating,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,14 +4,16 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/mapper"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type userBookPostCreate struct {
|
||||||
|
BookID uint `json:"bookId" binding:"required"`
|
||||||
|
}
|
||||||
|
|
||||||
func PostUserBookHandler(ac appcontext.AppContext) {
|
func PostUserBookHandler(ac appcontext.AppContext) {
|
||||||
var userbook dto.UserBookPostCreate
|
var userbook userBookPostCreate
|
||||||
err := ac.C.ShouldBindJSON(&userbook)
|
err := ac.C.ShouldBindJSON(&userbook)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
@@ -27,7 +29,7 @@ func PostUserBookHandler(ac appcontext.AppContext) {
|
|||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
userbookDb := mapper.UserBookWsToDb(userbook, &user)
|
userbookDb := userBookWsToDb(userbook, &user)
|
||||||
err = ac.Db.Save(&userbookDb).Error
|
err = ac.Db.Save(&userbookDb).Error
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
@@ -35,3 +37,10 @@ func PostUserBookHandler(ac appcontext.AppContext) {
|
|||||||
}
|
}
|
||||||
ac.C.String(http.StatusOK, "Success")
|
ac.C.String(http.StatusOK, "Success")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func userBookWsToDb(ub userBookPostCreate, user *model.User) model.UserBook {
|
||||||
|
return model.UserBook{
|
||||||
|
UserID: user.ID,
|
||||||
|
BookID: ub.BookID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/i18nresource"
|
"git.artlef.fr/PersonalLibraryManager/internal/i18nresource"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/jwtauth"
|
"git.artlef.fr/PersonalLibraryManager/internal/jwtauth"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
||||||
@@ -15,8 +14,13 @@ import (
|
|||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type userLogin struct {
|
||||||
|
Username string `json:"username" binding:"required,min=2,max=20"`
|
||||||
|
Password string `json:"password" binding:"required,min=6,max=100"`
|
||||||
|
}
|
||||||
|
|
||||||
func PostLoginHandler(ac appcontext.AppContext) {
|
func PostLoginHandler(ac appcontext.AppContext) {
|
||||||
var user dto.UserLogin
|
var user userLogin
|
||||||
err := ac.C.ShouldBindJSON(&user)
|
err := ac.C.ShouldBindJSON(&user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
|
|||||||
@@ -2,20 +2,24 @@ package routes
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/dto"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/mapper"
|
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
||||||
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type userSignup struct {
|
||||||
|
Username string `json:"username" binding:"required,min=2,max=20"`
|
||||||
|
Password string `json:"password" binding:"required,min=6,max=100"`
|
||||||
|
}
|
||||||
|
|
||||||
func PostSignupHandler(ac appcontext.AppContext) {
|
func PostSignupHandler(ac appcontext.AppContext) {
|
||||||
var user dto.UserSignup
|
var user userSignup
|
||||||
err := ac.C.ShouldBindJSON(&user)
|
err := ac.C.ShouldBindJSON(&user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
userDb, err := mapper.UserWsToDb(user)
|
userDb, err := userWsToDb(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
||||||
return
|
return
|
||||||
@@ -27,3 +31,16 @@ func PostSignupHandler(ac appcontext.AppContext) {
|
|||||||
}
|
}
|
||||||
ac.C.String(200, "Success")
|
ac.C.String(200, "Success")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func userWsToDb(u userSignup) (model.User, error) {
|
||||||
|
user := model.User{
|
||||||
|
Name: u.Username,
|
||||||
|
Password: "",
|
||||||
|
}
|
||||||
|
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
|
||||||
|
if err != nil {
|
||||||
|
return user, err
|
||||||
|
}
|
||||||
|
user.Password = string(hashedPassword)
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user