diff options
| author | Vidhu Kant Sharma <vidhukant@vidhukant.com> | 2024-07-09 11:31:08 +0530 | 
|---|---|---|
| committer | Vidhu Kant Sharma <vidhukant@vidhukant.com> | 2024-07-09 11:31:08 +0530 | 
| commit | c3821df233523ab715fdf06d54c142394411c968 (patch) | |
| tree | 4f19352740fc5e38b5a8bd98244bafa30e037b1c /user | |
| parent | d0a44ff5cfad5d063929426e2420f6f0d55b1dbe (diff) | |
added logo/signature upload routes
Diffstat (limited to 'user')
| -rw-r--r-- | user/controller.go | 92 | ||||
| -rw-r--r-- | user/router.go | 4 | ||||
| -rw-r--r-- | user/service.go | 21 | ||||
| -rw-r--r-- | user/user.go | 22 | 
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  |