diff options
Diffstat (limited to 'user')
-rw-r--r-- | user/controller.go | 39 | ||||
-rw-r--r-- | user/hooks.go | 38 | ||||
-rw-r--r-- | user/router.go | 29 | ||||
-rw-r--r-- | user/service.go | 39 | ||||
-rw-r--r-- | user/user.go | 38 | ||||
-rw-r--r-- | user/validators.go | 87 |
6 files changed, 270 insertions, 0 deletions
diff --git a/user/controller.go b/user/controller.go new file mode 100644 index 0000000..abdcc5b --- /dev/null +++ b/user/controller.go @@ -0,0 +1,39 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package user + +import ( + "github.com/gin-gonic/gin" + "net/http" +) + +func handleGetUser (ctx *gin.Context) { + var user User + + //err = getUser(&user, uint(id)) + //if err != nil { + // ctx.Error(err) + // ctx.Abort() + // return + //} + + ctx.JSON(http.StatusOK, gin.H{ + "message": "success", + "data": user, + }) +} diff --git a/user/hooks.go b/user/hooks.go new file mode 100644 index 0000000..d49d8be --- /dev/null +++ b/user/hooks.go @@ -0,0 +1,38 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package user + +import ( + "gorm.io/gorm" +) + +func (u *User) BeforeCreate(tx *gorm.DB) error { + var err error + + err = validatePassword(u.Password) + if err != nil { + return err + } + + err = u.validate() + if err != nil { + return err + } + + return nil +} diff --git a/user/router.go b/user/router.go new file mode 100644 index 0000000..8a9ad86 --- /dev/null +++ b/user/router.go @@ -0,0 +1,29 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package user + +import ( + "github.com/gin-gonic/gin" +) + +func Routes(route *gin.RouterGroup) { + g := route.Group("/user") + { + g.GET("/", handleGetUser) + } +} diff --git a/user/service.go b/user/service.go new file mode 100644 index 0000000..8b3b712 --- /dev/null +++ b/user/service.go @@ -0,0 +1,39 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package user + +func (u *User) Create() error { + res := db.Create(u) + // TODO: handle potential errors + return res.Error +} + +//func (c *Customer) del() error { +// res := db.Delete(c) +// +// // 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 new file mode 100644 index 0000000..1324c0e --- /dev/null +++ b/user/user.go @@ -0,0 +1,38 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package user + +import ( + "gorm.io/gorm" + d "vidhukant.com/openbills/db" +) + +var db *gorm.DB +func init() { + db = d.DB + + db.AutoMigrate(&User{}) +} + +type User struct { + gorm.Model + Username string + Email string + Password string + IsVerified bool +} diff --git a/user/validators.go b/user/validators.go new file mode 100644 index 0000000..88239c6 --- /dev/null +++ b/user/validators.go @@ -0,0 +1,87 @@ +/* openbills - Server for web based Libre Billing Software + * Copyright (C) 2023 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +package user + +import ( + "strings" + e "errors" + "github.com/spf13/viper" + "vidhukant.com/openbills/errors" +) + +func validatePassword(pass string) error { + // check if password is too short + if len(pass) < viper.GetInt("security.min_password_length") { + return errors.ErrPasswordTooShort + } + + // check if password is too long + if len(pass) > viper.GetInt("security.max_password_length") { + return errors.ErrPasswordTooLong + } + + return nil +} + +// NOTE: very inefficient and really really really dumb but it works +// TODO: find a better (or even a remotely good) way +func validateUserField(field, value string) error { + if value != "" { + var count int64 + err := db.Model(&User{}). + Where(field + " = ?", value). + Count(&count). + Error + + if err != nil { + return err + } + + if count > 0 { + switch(field) { + case "username": + return errors.ErrNonUniqueUsername + case "email": + return errors.ErrNonUniqueEmail + default: + return e.New(field + " is not unique") + } + } + } + + return nil +} + +func (u *User) validate() error { + u.Username = strings.TrimSpace(u.Username) + u.Email = strings.TrimSpace(u.Email) + u.IsVerified = false + + // TODO: validate username length and stuff + // TODO: validate if email is valid + + var err error + for _, i := range [][]string{{"username", u.Username}, {"email", u.Email}} { + err = validateUserField(i[0], i[1]) + if err != nil { + return err + } + } + + return nil +} |