aboutsummaryrefslogtreecommitdiff
path: root/user
diff options
context:
space:
mode:
Diffstat (limited to 'user')
-rw-r--r--user/controller.go92
-rw-r--r--user/router.go4
-rw-r--r--user/service.go21
-rw-r--r--user/user.go22
4 files changed, 127 insertions, 12 deletions
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 <vidhukant@vidhukant.com>
+ * Copyright (C) 2023-2024 Vidhu Kant Sharma <vidhukant@vidhukant.com>
*
* 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 <vidhukant@vidhukant.com>
+ * Copyright (C) 2023-2024 Vidhu Kant Sharma <vidhukant@vidhukant.com>
*
* 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