From c3821df233523ab715fdf06d54c142394411c968 Mon Sep 17 00:00:00 2001 From: Vidhu Kant Sharma Date: Tue, 9 Jul 2024 11:31:08 +0530 Subject: added logo/signature upload routes --- user/controller.go | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ user/router.go | 4 ++- user/service.go | 21 ++++++++++++- user/user.go | 22 +++++++------ 4 files changed, 127 insertions(+), 12 deletions(-) (limited to 'user') diff --git a/user/controller.go b/user/controller.go index 15061cc..1dc85da 100644 --- a/user/controller.go +++ b/user/controller.go @@ -20,6 +20,8 @@ package user import ( e "vidhukant.com/openbills/errors" "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/spf13/viper" "net/http" ) @@ -51,6 +53,96 @@ func handleGetUser (ctx *gin.Context) { }) } +func handleUploadLogo(ctx *gin.Context) { + var user User + + uId, ok := ctx.Get("UserID") + if !ok { + ctx.Error(e.ErrUnauthorized) + ctx.Abort() + return + } + + userId := uId.(uint) + user.ID = userId + + // TODO: handle potential errors + file, err := ctx.FormFile("logo") + if err != nil { + ctx.Error(err) + ctx.Abort() + return + } + + dest := uuid.New().String() + + // TODO: handle potential errors + err = ctx.SaveUploadedFile(file, viper.GetString("data.upload_dir") + dest) + if err != nil { + ctx.Error(err) + ctx.Abort() + return + } + + // TODO: delete old file (if any) + err = user.update(map[string]interface{}{"logo_file": dest}) + if err != nil { + ctx.Error(err) + ctx.Abort() + return + } + + ctx.JSON(http.StatusOK, gin.H{ + "message": "success", + }) +} + +func handleUploadSignature(ctx *gin.Context) { + var user User + + uId, ok := ctx.Get("UserID") + if !ok { + ctx.Error(e.ErrUnauthorized) + ctx.Abort() + return + } + + userId := uId.(uint) + user.ID = userId + + // TODO: handle potential errors + file, err := ctx.FormFile("signature") + if err != nil { + ctx.Error(err) + ctx.Abort() + return + } + + dest := uuid.New().String() + + // TODO: handle potential errors + err = ctx.SaveUploadedFile(file, viper.GetString("data.upload_dir") + dest) + if err != nil { + ctx.Error(err) + ctx.Abort() + return + } + + // TODO: delete old file (if any) + err = user.update(map[string]interface{}{"signature_file": dest}) + if err != nil { + ctx.Error(err) + ctx.Abort() + return + } + + ctx.JSON(http.StatusOK, gin.H{ + "message": "success", + }) +} + +// TODO: fix this stuff +// also add some kind of 2 factor verification func handleDelUser (ctx *gin.Context) { id := uint(1) // get from JWT diff --git a/user/router.go b/user/router.go index 8a9ad86..d9fa7e0 100644 --- a/user/router.go +++ b/user/router.go @@ -1,5 +1,5 @@ /* openbills - Server for web based Libre Billing Software - * Copyright (C) 2023 Vidhu Kant Sharma + * Copyright (C) 2023-2024 Vidhu Kant Sharma * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,5 +25,7 @@ func Routes(route *gin.RouterGroup) { g := route.Group("/user") { g.GET("/", handleGetUser) + g.POST("/logo", handleUploadLogo) + g.POST("/signature", handleUploadSignature) } } diff --git a/user/service.go b/user/service.go index 4544cb4..222df4a 100644 --- a/user/service.go +++ b/user/service.go @@ -1,5 +1,5 @@ /* openbills - Server for web based Libre Billing Software - * Copyright (C) 2023 Vidhu Kant Sharma + * Copyright (C) 2023-2024 Vidhu Kant Sharma * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -75,3 +75,22 @@ func (u *User) del() error { return nil } + +func (u *User) update(changes map[string]interface{}) error { + res := db.Model(&u). + Omit("email"). + Omit("password"). + Omit("username"). + Updates(changes) + + // TODO: handle potential errors + if res.Error != nil { + return res.Error + } + + if res.RowsAffected == 0 { + return e.ErrNotFound + } + + return nil +} diff --git a/user/user.go b/user/user.go index 726c5c2..b130ab9 100644 --- a/user/user.go +++ b/user/user.go @@ -40,17 +40,19 @@ func init() { type User struct { gorm.Model u.Address - FullName string - FirmName string - Gstin string - Phone string - Email string - Website string - Username string - Password string + FullName string + FirmName string + Gstin string + Phone string + Email string + Website string + Username string + Password string + LogoFile string + SignatureFile string // will be printed with address on the invoice - Details string - IsVerified bool + Details string + IsVerified bool // a note is printed on every invoice. // This is the default that gets automatically set DefaultInvoiceNote string -- cgit v1.2.3