project init
This commit is contained in:
commit
b79701e87c
|
|
@ -0,0 +1,45 @@
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Output of the go coverage tool
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Temporary files
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
|
||||||
|
# Build directories
|
||||||
|
_build/
|
||||||
|
_builds/
|
||||||
|
bin/
|
||||||
|
out/
|
||||||
|
|
||||||
|
# Vendor directory
|
||||||
|
vendor/
|
||||||
|
|
||||||
|
# Go modules
|
||||||
|
go.sum
|
||||||
|
|
||||||
|
# IDE and editor files
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*.DS_Store
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
Godeps/
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Coverage files
|
||||||
|
coverage.out
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"github.com/joho/godotenv"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DbConfig struct {
|
||||||
|
DBUser string
|
||||||
|
DBPass string
|
||||||
|
DBHost string
|
||||||
|
DBPort string
|
||||||
|
DBName string
|
||||||
|
}
|
||||||
|
type LoginConfig struct {
|
||||||
|
LoginAPI string
|
||||||
|
AuthMeAPI string
|
||||||
|
LogoutAPI string
|
||||||
|
}
|
||||||
|
type TokenConfig struct {
|
||||||
|
PassiveAssetIssuer string
|
||||||
|
JwtSignatureKey []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
type ApiConfig struct {
|
||||||
|
ApiPort string
|
||||||
|
}
|
||||||
|
|
||||||
|
type TokenApi struct {
|
||||||
|
TokenApiKey string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
DbConfig
|
||||||
|
TokenConfig
|
||||||
|
TokenApi
|
||||||
|
ApiConfig
|
||||||
|
LoginConfig
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Config) readConfig() error {
|
||||||
|
if err := godotenv.Load(); err != nil {
|
||||||
|
|
||||||
|
return errors.New("failed to load environment variables")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.DbConfig = DbConfig{
|
||||||
|
DBHost: os.Getenv("DB_HOST"),
|
||||||
|
DBPort: os.Getenv("DB_PORT"),
|
||||||
|
DBName: os.Getenv("DB_NAME"),
|
||||||
|
DBUser: os.Getenv("DB_USER"),
|
||||||
|
DBPass: os.Getenv("DB_PASSWORD"),
|
||||||
|
}
|
||||||
|
|
||||||
|
c.ApiConfig = ApiConfig{
|
||||||
|
ApiPort: os.Getenv("API_PORT"),
|
||||||
|
}
|
||||||
|
|
||||||
|
c.TokenConfig = TokenConfig{
|
||||||
|
PassiveAssetIssuer: os.Getenv("PASSIVE_ASSET_ISSUER"),
|
||||||
|
JwtSignatureKey: []byte(os.Getenv("TOKEN_KEY")),
|
||||||
|
}
|
||||||
|
|
||||||
|
c.TokenApi = TokenApi{
|
||||||
|
TokenApiKey: os.Getenv("TOKEN_API_KEY"),
|
||||||
|
}
|
||||||
|
|
||||||
|
c.LoginConfig = LoginConfig{
|
||||||
|
LoginAPI: os.Getenv("API_LOGIN_URL"),
|
||||||
|
AuthMeAPI: os.Getenv("API_ME_URL"),
|
||||||
|
LogoutAPI: os.Getenv("API_LOGOUT_URL"),
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.ApiConfig.ApiPort == "" {
|
||||||
|
return errors.New("failed to read environment variables")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewConfig() (*Config, error) {
|
||||||
|
config := &Config{}
|
||||||
|
err := config.readConfig()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return config, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BackboneController struct {
|
||||||
|
bu usecase.BackboneUseCase
|
||||||
|
rg *gin.RouterGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bc *BackboneController) Route() {
|
||||||
|
rg := bc.rg.Group("/backbone")
|
||||||
|
rg.GET("", bc.GetBackbone())
|
||||||
|
rg.POST("", bc.CreateBackbone())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBackboneController(bu usecase.BackboneUseCase, rg *gin.RouterGroup) *BackboneController {
|
||||||
|
return &BackboneController{
|
||||||
|
bu: bu,
|
||||||
|
rg: rg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bc *BackboneController) GetBackbone() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
backbones, err := bc.bu.GetAllBackbone()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Success", backbones)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bc *BackboneController) CreateBackbone() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var backboneDTO req.BackboneDTO
|
||||||
|
err := c.ShouldBindJSON(&backboneDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = bc.bu.CreateBackbone(backboneDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Backbone has been created", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DevicePortController struct {
|
||||||
|
du usecase.DevicePortUseCase
|
||||||
|
rg *gin.RouterGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DevicePortController) Route() {
|
||||||
|
rg := dc.rg.Group("/device-port")
|
||||||
|
rg.GET("", dc.GetDevicePort())
|
||||||
|
rg.POST("", dc.CreateDevicePort())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDevicePortController(du usecase.DevicePortUseCase, rg *gin.RouterGroup) *DevicePortController {
|
||||||
|
return &DevicePortController{
|
||||||
|
du: du,
|
||||||
|
rg: rg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DevicePortController) GetDevicePort() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
devicePorts, err := dc.du.GetAllDevicePort()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Success", devicePorts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DevicePortController) CreateDevicePort() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var devicePortDTO req.DevicePort
|
||||||
|
err := c.ShouldBindJSON(&devicePortDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dc.du.CreateDevicePort(devicePortDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Device Port has been created", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeviceController struct {
|
||||||
|
du usecase.DeviceUseCase
|
||||||
|
rg *gin.RouterGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DeviceController) Route() {
|
||||||
|
rg := dc.rg.Group("/devices")
|
||||||
|
rg.POST("", dc.CreateDevice())
|
||||||
|
rg.GET("", dc.GetAllDevices())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDeviceController(du usecase.DeviceUseCase, rg *gin.RouterGroup) *DeviceController {
|
||||||
|
return &DeviceController{
|
||||||
|
du: du,
|
||||||
|
rg: rg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DeviceController) CreateDevice() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var deviceDTO req.DeviceDTO
|
||||||
|
err := c.ShouldBindJSON(&deviceDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = dc.du.CreateDevice(deviceDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Device has been created", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DeviceController) GetAllDevices() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
devices, err := dc.du.GetAllDevices()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Success", devices)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FishboneController struct {
|
||||||
|
fu usecase.FishboneUseCase
|
||||||
|
rg *gin.RouterGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fc *FishboneController) Route() {
|
||||||
|
rg := fc.rg.Group("/fishbone")
|
||||||
|
rg.GET("", fc.GetFishbone())
|
||||||
|
rg.POST("", fc.CreateFishbone())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFishboneController(fu usecase.FishboneUseCase, rg *gin.RouterGroup) *FishboneController {
|
||||||
|
return &FishboneController{
|
||||||
|
fu: fu,
|
||||||
|
rg: rg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fc *FishboneController) GetFishbone() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
fishbones, err := fc.fu.GetAllFishbone()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Success", fishbones)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (fc *FishboneController) CreateFishbone() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var fishboneDTO req.FishboneDTO
|
||||||
|
err := c.ShouldBindJSON(&fishboneDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = fc.fu.CreateFishbone(fishboneDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Fishbone has been created", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TowerController struct {
|
||||||
|
tu usecase.TowerUseCase
|
||||||
|
rg *gin.RouterGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tc *TowerController) Route() {
|
||||||
|
rg := tc.rg.Group("/tower")
|
||||||
|
rg.GET("", tc.GetTower())
|
||||||
|
rg.POST("", tc.CreateTower())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTowerController(tu usecase.TowerUseCase, rg *gin.RouterGroup) *TowerController {
|
||||||
|
return &TowerController{
|
||||||
|
tu: tu,
|
||||||
|
rg: rg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tc *TowerController) GetTower() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
towers, err := tc.tu.GetAll()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Success", towers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tc *TowerController) CreateTower() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var towerDTO req.TowerDTO
|
||||||
|
err := c.ShouldBindJSON(&towerDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = tc.tu.Post(towerDTO)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Tower has been created", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
package controller
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UsersController struct {
|
||||||
|
uc usecase.UsersUsecase
|
||||||
|
ac usecase.AuthUsecase
|
||||||
|
rg *gin.RouterGroup
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uc *UsersController) Route() {
|
||||||
|
rg:= uc.rg.Group("/users")
|
||||||
|
rg.POST("/login", uc.Login())
|
||||||
|
rg.POST("/logout", uc.Logout())
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUsersController(uc usecase.UsersUsecase, ac usecase.AuthUsecase,rg *gin.RouterGroup) *UsersController {
|
||||||
|
return &UsersController{
|
||||||
|
uc: uc,
|
||||||
|
ac: ac,
|
||||||
|
rg: rg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uc *UsersController) Login() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
var login dto.UserLoginDTO
|
||||||
|
err := c.ShouldBindJSON(&login)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
token, err := uc.ac.Login(login)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusUnauthorized, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Login success", gin.H{"token": token})
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (uc *UsersController) Logout() gin.HandlerFunc {
|
||||||
|
return func(c *gin.Context) {
|
||||||
|
token := c.GetHeader("Authorization")
|
||||||
|
err := uc.ac.Logout(token)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
common.ErrorResponses(c, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
common.SingleResponses(c, "Logout success", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
package delivery
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"users_management/m/config"
|
||||||
|
"users_management/m/delivery/controller"
|
||||||
|
"users_management/m/manager"
|
||||||
|
"users_management/m/utils/common"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Server struct {
|
||||||
|
ucManager manager.UsecaseManager
|
||||||
|
engine *gin.Engine
|
||||||
|
host string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewServer() *Server {
|
||||||
|
cfg, err := config.NewConfig()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
infraManager, err := manager.NewInfraManager(cfg)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
repoManager := manager.NewRepositoryManager(infraManager)
|
||||||
|
ucManager := manager.NewUsecaseManager(repoManager, cfg)
|
||||||
|
engine := gin.Default()
|
||||||
|
engine.Use(common.LoggingToFile())
|
||||||
|
host := fmt.Sprintf(":%s", cfg.ApiPort)
|
||||||
|
|
||||||
|
return &Server{
|
||||||
|
ucManager: ucManager,
|
||||||
|
engine: engine,
|
||||||
|
host: host,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) setupController() {
|
||||||
|
rg := s.engine.Group("/api/v1")
|
||||||
|
controller.NewUsersController(s.ucManager.NewUserUsecase(), s.ucManager.NewAuthUsecase(),rg).Route()
|
||||||
|
controller.NewDeviceController(s.ucManager.NewDeviceUsecase(), rg).Route()
|
||||||
|
controller.NewBackboneController(s.ucManager.NewBackboneUsecase(), rg).Route()
|
||||||
|
controller.NewFishboneController(s.ucManager.NewFishboneUsecase(), rg).Route()
|
||||||
|
controller.NewTowerController(s.ucManager.NewTowerUsecase(), rg).Route()
|
||||||
|
controller.NewDevicePortController(s.ucManager.NewDevicePortUsecase(), rg).Route()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Run() {
|
||||||
|
s.setupController()
|
||||||
|
if err := s.engine.Run(s.host); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
module users_management/m
|
||||||
|
|
||||||
|
go 1.23.1
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/gin-gonic/gin v1.10.0
|
||||||
|
github.com/go-playground/validator/v10 v10.24.0
|
||||||
|
github.com/google/uuid v1.6.0
|
||||||
|
github.com/joho/godotenv v1.5.1
|
||||||
|
gorm.io/driver/postgres v1.5.11
|
||||||
|
gorm.io/gorm v1.25.12
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/bytedance/sonic v1.12.8 // indirect
|
||||||
|
github.com/bytedance/sonic/loader v0.2.3 // indirect
|
||||||
|
github.com/cloudwego/base64x v0.1.5 // indirect
|
||||||
|
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||||
|
github.com/gin-contrib/sse v1.0.0 // indirect
|
||||||
|
github.com/go-playground/locales v0.14.1 // indirect
|
||||||
|
github.com/go-playground/universal-translator v0.18.1 // indirect
|
||||||
|
github.com/goccy/go-json v0.10.5 // indirect
|
||||||
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
|
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
|
||||||
|
github.com/jackc/pgx/v5 v5.5.5 // indirect
|
||||||
|
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
||||||
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
|
||||||
|
github.com/kr/text v0.2.0 // indirect
|
||||||
|
github.com/leodido/go-urn v1.4.0 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
|
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
||||||
|
github.com/rogpeppe/go-internal v1.13.1 // indirect
|
||||||
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
|
github.com/ugorji/go/codec v1.2.12 // indirect
|
||||||
|
golang.org/x/arch v0.14.0 // indirect
|
||||||
|
golang.org/x/crypto v0.33.0 // indirect
|
||||||
|
golang.org/x/net v0.35.0 // indirect
|
||||||
|
golang.org/x/sync v0.11.0 // indirect
|
||||||
|
golang.org/x/sys v0.30.0 // indirect
|
||||||
|
golang.org/x/text v0.22.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.5 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "users_management/m/delivery"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
delivery.NewServer().Run()
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
package manager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"users_management/m/config"
|
||||||
|
"gorm.io/driver/postgres"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type InfraManager interface {
|
||||||
|
Conn() *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
type infraManager struct {
|
||||||
|
db *gorm.DB
|
||||||
|
cfg *config.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func (im *infraManager) openConn() error {
|
||||||
|
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Asia/Shanghai",
|
||||||
|
im.cfg.DBHost, im.cfg.DBUser, im.cfg.DBPass, im.cfg.DBName, im.cfg.DBPort)
|
||||||
|
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
im.db = db
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewInfraManager(cfg *config.Config) (InfraManager, error) {
|
||||||
|
im := &infraManager{
|
||||||
|
cfg: cfg,
|
||||||
|
}
|
||||||
|
err := im.openConn()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return im, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (im *infraManager) Conn() *gorm.DB {
|
||||||
|
return im.db
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
package manager
|
||||||
|
|
||||||
|
import "users_management/m/repository"
|
||||||
|
|
||||||
|
type RepositoryManager interface {
|
||||||
|
NewUserRepository() repository.UsersRepo
|
||||||
|
NewDeviceRepository() repository.DevicesRepo
|
||||||
|
NewBackboneRepository() repository.BackboneRepo
|
||||||
|
NewFishboneRepository() repository.FishboneRepo
|
||||||
|
NewTowerRepository() repository.TowerRepo
|
||||||
|
|
||||||
|
NewDevicePortRepository() repository.DevicePortRepo
|
||||||
|
}
|
||||||
|
|
||||||
|
type repositoryManager struct {
|
||||||
|
infra InfraManager
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRepositoryManager(infra InfraManager) RepositoryManager {
|
||||||
|
return &repositoryManager{
|
||||||
|
infra: infra,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rm *repositoryManager) NewUserRepository() repository.UsersRepo {
|
||||||
|
return repository.NewUsersRepo(rm.infra.Conn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rm *repositoryManager) NewDeviceRepository() repository.DevicesRepo {
|
||||||
|
return repository.NewDevicesRepo(rm.infra.Conn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rm *repositoryManager) NewBackboneRepository() repository.BackboneRepo {
|
||||||
|
return repository.NewBackboneRepo(rm.infra.Conn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rm *repositoryManager) NewFishboneRepository() repository.FishboneRepo {
|
||||||
|
return repository.NewFishboneRepo(rm.infra.Conn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rm *repositoryManager) NewTowerRepository() repository.TowerRepo {
|
||||||
|
return repository.NewTowerRepo(rm.infra.Conn())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rm *repositoryManager) NewDevicePortRepository() repository.DevicePortRepo {
|
||||||
|
return repository.NewDevicePortRepo(rm.infra.Conn())
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package manager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/config"
|
||||||
|
"users_management/m/usecase"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UsecaseManager interface {
|
||||||
|
NewUserUsecase() usecase.UsersUsecase
|
||||||
|
NewAuthUsecase() usecase.AuthUsecase
|
||||||
|
NewDeviceUsecase() usecase.DeviceUseCase
|
||||||
|
NewBackboneUsecase() usecase.BackboneUseCase
|
||||||
|
NewFishboneUsecase() usecase.FishboneUseCase
|
||||||
|
|
||||||
|
NewTowerUsecase() usecase.TowerUseCase
|
||||||
|
|
||||||
|
NewDevicePortUsecase() usecase.DevicePortUseCase
|
||||||
|
}
|
||||||
|
|
||||||
|
type usecaseManager struct {
|
||||||
|
repo RepositoryManager
|
||||||
|
cfg *config.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUsecaseManager(repo RepositoryManager, cfg *config.Config) UsecaseManager {
|
||||||
|
return &usecaseManager{repo: repo,cfg: cfg }
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewUserUsecase() usecase.UsersUsecase {
|
||||||
|
return usecase.NewUsersUsecase(um.repo.NewUserRepository())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewAuthUsecase() usecase.AuthUsecase {
|
||||||
|
return usecase.NewAuthUsecase(um.repo.NewUserRepository(), um.cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewDeviceUsecase() usecase.DeviceUseCase {
|
||||||
|
return usecase.NewDeviceUseCase(um.repo.NewDeviceRepository())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewBackboneUsecase() usecase.BackboneUseCase {
|
||||||
|
return usecase.NewBackboneUseCase(um.repo.NewBackboneRepository())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewFishboneUsecase() usecase.FishboneUseCase {
|
||||||
|
return usecase.NewFishboneUseCase(um.repo.NewFishboneRepository())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewTowerUsecase() usecase.TowerUseCase {
|
||||||
|
return usecase.NewTowerUseCase(um.repo.NewTowerRepository())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (um *usecaseManager) NewDevicePortUsecase() usecase.DevicePortUseCase {
|
||||||
|
return usecase.NewDevicePortUseCase(um.repo.NewDevicePortRepository())
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
package req
|
||||||
|
|
||||||
|
import "github.com/google/uuid"
|
||||||
|
|
||||||
|
type BackboneDTO struct {
|
||||||
|
DeviceStartID uuid.UUID `json:"dev_start_id"`
|
||||||
|
DeviceEndID uuid.UUID `json:"dev_end_id"`
|
||||||
|
CoreAmount int `json:"core_amount"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
package req
|
||||||
|
|
||||||
|
import "github.com/google/uuid"
|
||||||
|
|
||||||
|
type DevicePort struct {
|
||||||
|
DeviceID uuid.UUID `json:"device_id"`
|
||||||
|
PortNumber int `json:"port_number"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package req
|
||||||
|
|
||||||
|
|
||||||
|
type DeviceDTO struct {
|
||||||
|
DeviceCode string `json:"device_code" validate:"required"`
|
||||||
|
DeviceType string `json:"device_type" validate:"required"`
|
||||||
|
Longitude float64 `json:"longitude" validate:"required"`
|
||||||
|
Latitude float64 `json:"latitude" validate:"required"`
|
||||||
|
PortAmount int `json:"port_amount" validate:"required"`
|
||||||
|
Status string `json:"status" validate:"required,oneof=active inactive maintenance"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package req
|
||||||
|
|
||||||
|
import "github.com/google/uuid"
|
||||||
|
|
||||||
|
type FishboneDTO struct {
|
||||||
|
BackboneID uuid.UUID `json:"bb_id"`
|
||||||
|
DeviceStartID uuid.UUID `json:"dev_start_id"`
|
||||||
|
DeviceEndID uuid.UUID `json:"dev_end_id"`
|
||||||
|
CoreAmount int `json:"core_amount"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package req
|
||||||
|
|
||||||
|
import "github.com/google/uuid"
|
||||||
|
|
||||||
|
type TowerDTO struct {
|
||||||
|
DeviceID uuid.UUID `json:"dev_id"`
|
||||||
|
TowerCode string `json:"tower_code"`
|
||||||
|
Longitude float64 `json:"longitude"`
|
||||||
|
Latitude float64 `json:"latitude"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package res
|
||||||
|
|
||||||
|
type AuthResponses struct {
|
||||||
|
Token string `json:"token"`
|
||||||
|
Detail AuthMeResponse `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AuthMeResponse struct {
|
||||||
|
Success bool `json:"success"`
|
||||||
|
Data struct {
|
||||||
|
NomorInduk string `json:"nomor_induk"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
Nama string `json:"nama"`
|
||||||
|
JenisKelamin string `json:"jenis_kelamin"`
|
||||||
|
Perusahaan string `json:"perusahaan"`
|
||||||
|
Cabang string `json:"cabang"`
|
||||||
|
Departemen string `json:"departemen"`
|
||||||
|
Jabatan string `json:"jabatan"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package res
|
||||||
|
|
||||||
|
type Status struct {
|
||||||
|
Code int `json:"code"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SingleResponses struct {
|
||||||
|
Status Status `json:"status"`
|
||||||
|
Data any `json:"data"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
package dto
|
||||||
|
|
||||||
|
type UserRegisterDTO struct {
|
||||||
|
Name string `json:"name" validate:"required"`
|
||||||
|
Username string `json:"username" validate:"required"`
|
||||||
|
Password string `json:"password" validate:"required"`
|
||||||
|
RoleID string `json:"role_id" validate:"required,uuid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserLoginDTO struct {
|
||||||
|
Username string `json:"username" validate:"required"`
|
||||||
|
Password string `json:"password" validate:"required"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Backbone struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
|
DeviceStartID uuid.UUID `json:"dev_start_id" gorm:"column:dev_start_id"`
|
||||||
|
DeviceEndID uuid.UUID `json:"dev_end_id" gorm:"column:dev_end_id"`
|
||||||
|
CoreAmount int `json:"core_amount"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
|
||||||
|
DeviceStart Device `gorm:"foreignKey:DeviceStartID"`
|
||||||
|
DeviceEnd Device `gorm:"foreignKey:DeviceEndID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (Backbone) TableName() string {
|
||||||
|
return "backbone"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DevicePort struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
|
DeviceID uuid.UUID `json:"device_id" gorm:"column:device_id"`
|
||||||
|
PortNumber int `json:"port_number"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
|
||||||
|
Device Device `gorm:"foreignKey:DeviceID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (DevicePort) TableName() string {
|
||||||
|
return "device_ports"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeviceType string
|
||||||
|
type DeviceStatus string
|
||||||
|
|
||||||
|
const (
|
||||||
|
Odp DeviceType = "ODP"
|
||||||
|
activeDev DeviceStatus = "active"
|
||||||
|
inactiveDev DeviceStatus = "inactive"
|
||||||
|
maintenanceDev DeviceStatus = "maintenance"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Device struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
|
DeviceCode string `json:"device_code"`
|
||||||
|
DeviceType DeviceType `json:"device_type"`
|
||||||
|
Longitude float64 `json:"longitude"`
|
||||||
|
Latitude float64 `json:"latitude"`
|
||||||
|
PortAmount int `json:"port_amount"`
|
||||||
|
Status DeviceStatus `json:"status"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Fishbone struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
|
BackboneID uuid.UUID `json:"backbone_id" gorm:"column:bb_id"`
|
||||||
|
DeviceStartID uuid.UUID `json:"dev_start_id" gorm:"column:dev_start_id"`
|
||||||
|
DeviceEndID uuid.UUID `json:"dev_end_id" gorm:"column:dev_end_id"`
|
||||||
|
CoreAmount int `json:"core_amount"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
|
||||||
|
DeviceStart Device `gorm:"foreignKey:DeviceStartID"`
|
||||||
|
DeviceEnd Device `gorm:"foreignKey:DeviceEndID"`
|
||||||
|
|
||||||
|
Backbone Backbone `gorm:"foreignKey:BackboneID"`
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (Fishbone) TableName() string {
|
||||||
|
return "fishbone"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import "github.com/google/uuid"
|
||||||
|
|
||||||
|
type Role struct {
|
||||||
|
Id uuid.UUID `json:"id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
CreatedAt string `json:"created_at"`
|
||||||
|
UpdatedAt string `json:"updated_at"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Tower struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
|
DeviceID uuid.UUID`json:"dev_id" gorm:"column:dev_id"`
|
||||||
|
TowerCode string `json:"tower_code"`
|
||||||
|
Longitude float64 `json:"longitude"`
|
||||||
|
Latitude float64 `json:"latitude"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
|
||||||
|
Device Device `gorm:"foreignKey:DeviceID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (Tower) TableName() string {
|
||||||
|
return "towers"
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
ID uuid.UUID `json:"id"`
|
||||||
|
RoleID uuid.UUID `json:"role_id"`
|
||||||
|
Role Role `json:"role"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
Password string `json:"password"`
|
||||||
|
CreatedAt time.Time `json:"created_at"`
|
||||||
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BackboneRepo interface {
|
||||||
|
Post(backbone entity.Backbone) error
|
||||||
|
GetAll() ([]entity.Backbone, error)
|
||||||
|
Update(backbone entity.Backbone) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type backboneRepo struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBackboneRepo(db *gorm.DB) BackboneRepo {
|
||||||
|
return &backboneRepo{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *backboneRepo) Post(backbone entity.Backbone) error {
|
||||||
|
err := r.db.Create(&backbone).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *backboneRepo) GetAll() ([]entity.Backbone, error) {
|
||||||
|
var backbones []entity.Backbone
|
||||||
|
err := r.db.Find(&backbones).Error
|
||||||
|
if err != nil {
|
||||||
|
return backbones, err
|
||||||
|
}
|
||||||
|
return backbones, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *backboneRepo) Update(backbone entity.Backbone) error {
|
||||||
|
err := r.db.Save(&backbone).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DevicePortRepo interface {
|
||||||
|
Post(devicePort entity.DevicePort) error
|
||||||
|
GetAll() ([]entity.DevicePort, error)
|
||||||
|
Update(devicePort entity.DevicePort) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type devicePortRepo struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDevicePortRepo(db *gorm.DB) DevicePortRepo {
|
||||||
|
return &devicePortRepo{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *devicePortRepo) Post(devicePort entity.DevicePort) error {
|
||||||
|
err := r.db.Create(&devicePort).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *devicePortRepo) GetAll() ([]entity.DevicePort, error) {
|
||||||
|
var devicePorts []entity.DevicePort
|
||||||
|
err := r.db.Find(&devicePorts).Error
|
||||||
|
if err != nil {
|
||||||
|
return devicePorts, err
|
||||||
|
}
|
||||||
|
return devicePorts, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *devicePortRepo) Update(devicePort entity.DevicePort) error {
|
||||||
|
err := r.db.Save(&devicePort).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DevicesRepo interface {
|
||||||
|
Post(device entity.Device) error
|
||||||
|
GetAll() ([]entity.Device, error)
|
||||||
|
Update(device entity.Device) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type devicesRepo struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDevicesRepo(db *gorm.DB) DevicesRepo {
|
||||||
|
return &devicesRepo{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *devicesRepo) Post(device entity.Device) error {
|
||||||
|
err := r.db.Create(&device).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *devicesRepo) GetAll() ([]entity.Device, error) {
|
||||||
|
var devices []entity.Device
|
||||||
|
err := r.db.Find(&devices).Error
|
||||||
|
if err != nil {
|
||||||
|
return devices, err
|
||||||
|
}
|
||||||
|
return devices, nil
|
||||||
|
}
|
||||||
|
func (r *devicesRepo) Update(device entity.Device) error {
|
||||||
|
err := r.db.Save(&device).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FishboneRepo interface {
|
||||||
|
Post(fishbone entity.Fishbone) error
|
||||||
|
GetAll() ([]entity.Fishbone, error)
|
||||||
|
Update(fishbone entity.Fishbone) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type fishboneRepo struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFishboneRepo(db *gorm.DB) FishboneRepo {
|
||||||
|
return &fishboneRepo{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *fishboneRepo) Post(fishbone entity.Fishbone) error {
|
||||||
|
err := r.db.Create(&fishbone).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *fishboneRepo) GetAll() ([]entity.Fishbone, error) {
|
||||||
|
var fishbones []entity.Fishbone
|
||||||
|
err := r.db.Find(&fishbones).Error
|
||||||
|
if err != nil {
|
||||||
|
return fishbones, err
|
||||||
|
}
|
||||||
|
return fishbones, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *fishboneRepo) Update(fishbone entity.Fishbone) error {
|
||||||
|
err := r.db.Save(&fishbone).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TowerRepo interface {
|
||||||
|
Post(tower entity.Tower) error
|
||||||
|
GetAll() ([]entity.Tower, error)
|
||||||
|
Update(tower entity.Tower) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type towerRepo struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTowerRepo(db *gorm.DB) TowerRepo {
|
||||||
|
return &towerRepo{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *towerRepo) Post(tower entity.Tower) error {
|
||||||
|
err := r.db.Create(&tower).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *towerRepo) GetAll() ([]entity.Tower, error) {
|
||||||
|
var towers []entity.Tower
|
||||||
|
err := r.db.Find(&towers).Error
|
||||||
|
if err != nil {
|
||||||
|
return towers, err
|
||||||
|
}
|
||||||
|
return towers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *towerRepo) Update(tower entity.Tower) error {
|
||||||
|
err := r.db.Save(&tower).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UsersRepo interface {
|
||||||
|
Post(user entity.User) error
|
||||||
|
GetRoleByDepartment(departmentName string) (entity.Role, error)
|
||||||
|
GetUserByUsername(username string) (entity.User, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type usersRepo struct {
|
||||||
|
db *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUsersRepo(db *gorm.DB) UsersRepo {
|
||||||
|
return &usersRepo{
|
||||||
|
db: db,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *usersRepo) Post(user entity.User) error {
|
||||||
|
err := r.db.Create(&user).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *usersRepo) GetRoleByDepartment(departmentName string) (entity.Role, error) {
|
||||||
|
var role entity.Role
|
||||||
|
err := r.db.Where("name = ?", departmentName).First(&role).Error
|
||||||
|
if err != nil {
|
||||||
|
return role, err
|
||||||
|
}
|
||||||
|
return role, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *usersRepo) GetUserByUsername(username string) (entity.User, error) {
|
||||||
|
var users entity.User
|
||||||
|
err := r.db.Where("username = ?", username).First(&users).Error
|
||||||
|
if err != nil {
|
||||||
|
return users, err
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,181 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
"users_management/m/config"
|
||||||
|
"users_management/m/model/dto"
|
||||||
|
"users_management/m/model/dto/res"
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
"users_management/m/utils"
|
||||||
|
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AuthUsecase interface {
|
||||||
|
Login(login dto.UserLoginDTO) (string, error)
|
||||||
|
Logout(token string) error
|
||||||
|
}
|
||||||
|
|
||||||
|
type authUsecase struct {
|
||||||
|
userRepo repository.UsersRepo
|
||||||
|
validate *validator.Validate
|
||||||
|
cfg *config.Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAuthUsecase(userRepo repository.UsersRepo, cfg *config.Config) AuthUsecase {
|
||||||
|
return &authUsecase{
|
||||||
|
userRepo: userRepo,
|
||||||
|
validate: validator.New(),
|
||||||
|
cfg: cfg,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *authUsecase) Login(login dto.UserLoginDTO) (string, error) {
|
||||||
|
err := u.validate.Struct(login)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
payload, err := json.Marshal(login)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest("POST", u.cfg.LoginAPI, bytes.NewBuffer(payload))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
client := &http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return "", errors.New("wrong password or username")
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var authResponse res.AuthResponses
|
||||||
|
err = json.Unmarshal(body, &authResponse)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
token := authResponse.Token
|
||||||
|
|
||||||
|
meReq, err := http.NewRequest("POST", u.cfg.AuthMeAPI, nil)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
meReq.Header.Set("Authorization", "Bearer "+token)
|
||||||
|
meReq.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
meResp, err := client.Do(meReq)
|
||||||
|
if err != nil {
|
||||||
|
return "",err
|
||||||
|
}
|
||||||
|
defer meResp.Body.Close()
|
||||||
|
|
||||||
|
if meResp.StatusCode != http.StatusOK {
|
||||||
|
return "", errors.New("failed to validate token: " + meResp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
meBody, err := ioutil.ReadAll(meResp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var meResponse res.AuthMeResponse
|
||||||
|
err = json.Unmarshal(meBody, &meResponse)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
departemen := meResponse.Data.Departemen
|
||||||
|
if departemen != "Teknisi" {
|
||||||
|
return "", errors.New("user is not a technician")
|
||||||
|
}
|
||||||
|
|
||||||
|
role , err := u.userRepo.GetRoleByDepartment(departemen)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
password, err := utils.HashPassword(login.Password)
|
||||||
|
if err != nil {
|
||||||
|
return "error while hasing password: ", err
|
||||||
|
}
|
||||||
|
|
||||||
|
isUserExist, err := u.userRepo.GetUserByUsername(login.Username)
|
||||||
|
|
||||||
|
if isUserExist.ID != uuid.Nil {
|
||||||
|
// Validate the password
|
||||||
|
if !utils.CheckPasswordHash(login.Password, isUserExist.Password) {
|
||||||
|
return "", errors.New("incorrect password")
|
||||||
|
}
|
||||||
|
|
||||||
|
return token, nil
|
||||||
|
}else if err != nil && err != gorm.ErrRecordNotFound {
|
||||||
|
return "ERROR WHILE SEARCHING USERNAME", err
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
user := entity.User{
|
||||||
|
ID: uuid.New(),
|
||||||
|
Name: meResponse.Data.Nama,
|
||||||
|
Username: login.Username,
|
||||||
|
Password: password,
|
||||||
|
RoleID: role.Id,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
err = u.userRepo.Post(user)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
return token,nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *authUsecase) Logout(token string) error {
|
||||||
|
req, err := http.NewRequest("POST", u.cfg.LogoutAPI, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Set("Authorization", "Bearer "+token)
|
||||||
|
req.Header.Set("Accept", "application/json")
|
||||||
|
|
||||||
|
client := &http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
return errors.New("failed to logout: " + resp.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type BackboneUseCase interface {
|
||||||
|
CreateBackbone(backbone req.BackboneDTO) error
|
||||||
|
GetAllBackbone() ([]entity.Backbone, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type backboneUseCase struct {
|
||||||
|
backboneRepo repository.BackboneRepo
|
||||||
|
validate *validator.Validate
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBackboneUseCase(backboneRepo repository.BackboneRepo) BackboneUseCase {
|
||||||
|
return &backboneUseCase{
|
||||||
|
backboneRepo: backboneRepo,
|
||||||
|
validate: validator.New(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *backboneUseCase) CreateBackbone(backbone req.BackboneDTO) error {
|
||||||
|
err := u.validate.Struct(backbone)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("validation error: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
newBackbone := entity.Backbone{
|
||||||
|
ID: uuid.New(),
|
||||||
|
DeviceStartID: backbone.DeviceStartID,
|
||||||
|
DeviceEndID: backbone.DeviceEndID,
|
||||||
|
CoreAmount: backbone.CoreAmount,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return u.backboneRepo.Post(newBackbone)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *backboneUseCase) GetAllBackbone() ([]entity.Backbone, error) {
|
||||||
|
backbones, err := u.backboneRepo.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return backbones, err
|
||||||
|
}
|
||||||
|
return backbones, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,53 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DevicePortUseCase interface {
|
||||||
|
CreateDevicePort(devicePort req.DevicePort) error
|
||||||
|
GetAllDevicePort() ([]entity.DevicePort, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type devicePortUseCase struct {
|
||||||
|
devicePortRepo repository.DevicePortRepo
|
||||||
|
validate *validator.Validate
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDevicePortUseCase(devicePortRepo repository.DevicePortRepo) DevicePortUseCase {
|
||||||
|
return &devicePortUseCase{
|
||||||
|
devicePortRepo: devicePortRepo,
|
||||||
|
validate: validator.New(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *devicePortUseCase) CreateDevicePort(devicePort req.DevicePort) error {
|
||||||
|
err := u.validate.Struct(devicePort)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
newDevicePort := entity.DevicePort{
|
||||||
|
ID: uuid.New(),
|
||||||
|
DeviceID: devicePort.DeviceID,
|
||||||
|
PortNumber: devicePort.PortNumber,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.devicePortRepo.Post(newDevicePort)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *devicePortUseCase) GetAllDevicePort() ([]entity.DevicePort, error) {
|
||||||
|
devicePorts, err := u.devicePortRepo.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return devicePorts, err
|
||||||
|
}
|
||||||
|
return devicePorts, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeviceUseCase interface {
|
||||||
|
CreateDevice(device req.DeviceDTO) error
|
||||||
|
GetAllDevices() ([]entity.Device, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type deviceUseCase struct {
|
||||||
|
deviceRepo repository.DevicesRepo
|
||||||
|
validate *validator.Validate
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDeviceUseCase(deviceRepo repository.DevicesRepo) DeviceUseCase {
|
||||||
|
return &deviceUseCase{
|
||||||
|
deviceRepo: deviceRepo,
|
||||||
|
validate: validator.New(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *deviceUseCase) CreateDevice(device req.DeviceDTO) error {
|
||||||
|
err := u.validate.Struct(device)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("validation error: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
newDevice := entity.Device{
|
||||||
|
ID: uuid.New(),
|
||||||
|
DeviceCode: device.DeviceCode,
|
||||||
|
DeviceType: entity.DeviceType(device.DeviceType),
|
||||||
|
Longitude: device.Longitude,
|
||||||
|
Latitude: device.Latitude,
|
||||||
|
PortAmount: device.PortAmount,
|
||||||
|
Status: entity.DeviceStatus(device.Status),
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.deviceRepo.Post(newDevice)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *deviceUseCase) GetAllDevices() ([]entity.Device, error) {
|
||||||
|
devices, err := u.deviceRepo.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return devices, err
|
||||||
|
}
|
||||||
|
return devices, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type FishboneUseCase interface {
|
||||||
|
CreateFishbone(fishbone req.FishboneDTO) error
|
||||||
|
GetAllFishbone() ([]entity.Fishbone, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type fishboneUsecase struct {
|
||||||
|
fishboneRepo repository.FishboneRepo
|
||||||
|
validate *validator.Validate
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewFishboneUseCase(fishboneRepo repository.FishboneRepo) FishboneUseCase {
|
||||||
|
return &fishboneUsecase{
|
||||||
|
fishboneRepo: fishboneRepo,
|
||||||
|
validate: validator.New(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *fishboneUsecase) CreateFishbone(fishbone req.FishboneDTO) error {
|
||||||
|
err := u.validate.Struct(fishbone)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
newFishbone := entity.Fishbone{
|
||||||
|
ID: uuid.New(),
|
||||||
|
BackboneID: fishbone.BackboneID,
|
||||||
|
DeviceStartID: fishbone.DeviceStartID,
|
||||||
|
DeviceEndID: fishbone.DeviceEndID,
|
||||||
|
CoreAmount: fishbone.CoreAmount,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.fishboneRepo.Post(newFishbone)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *fishboneUsecase) GetAllFishbone() ([]entity.Fishbone, error) {
|
||||||
|
fishbones, err := u.fishboneRepo.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return fishbones, err
|
||||||
|
}
|
||||||
|
return fishbones, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
"users_management/m/model/dto/req"
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TowerUseCase interface {
|
||||||
|
Post(tower req.TowerDTO) error
|
||||||
|
GetAll() ([]entity.Tower, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type towerUsecase struct {
|
||||||
|
towerRepo repository.TowerRepo
|
||||||
|
validate *validator.Validate
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewTowerUseCase(towerRepo repository.TowerRepo) TowerUseCase {
|
||||||
|
return &towerUsecase{
|
||||||
|
towerRepo: towerRepo,
|
||||||
|
validate: validator.New(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *towerUsecase) Post(tower req.TowerDTO) error {
|
||||||
|
err := u.validate.Struct(tower)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
newTower := entity.Tower{
|
||||||
|
ID: uuid.New(),
|
||||||
|
DeviceID: tower.DeviceID,
|
||||||
|
TowerCode: tower.TowerCode,
|
||||||
|
Longitude: tower.Longitude,
|
||||||
|
Latitude: tower.Latitude,
|
||||||
|
CreatedAt: time.Now(),
|
||||||
|
UpdatedAt: time.Now(),
|
||||||
|
}
|
||||||
|
|
||||||
|
return u.towerRepo.Post(newTower)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *towerUsecase) GetAll() ([]entity.Tower, error) {
|
||||||
|
towers, err := u.towerRepo.GetAll()
|
||||||
|
if err != nil {
|
||||||
|
return towers, err
|
||||||
|
}
|
||||||
|
return towers, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"users_management/m/model/entity"
|
||||||
|
"users_management/m/repository"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UsersUsecase interface {
|
||||||
|
GetRoleByDepartment(departmentName string) (uuid.UUID, error)
|
||||||
|
GetUserByUsername(username string) (entity.User, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type usersUsecase struct {
|
||||||
|
userRepo repository.UsersRepo
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUsersUsecase(userRepo repository.UsersRepo) UsersUsecase {
|
||||||
|
return &usersUsecase{
|
||||||
|
userRepo: userRepo,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func (u *usersUsecase) GetRoleByDepartment(departmentName string) (uuid.UUID, error) {
|
||||||
|
|
||||||
|
role, err := u.userRepo.GetRoleByDepartment(departmentName)
|
||||||
|
if err != nil {
|
||||||
|
return uuid.Nil, err
|
||||||
|
}
|
||||||
|
return role.Id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *usersUsecase) GetUserByUsername(username string) (entity.User, error) {
|
||||||
|
users, err := u.userRepo.GetUserByUsername(username)
|
||||||
|
if err != nil {
|
||||||
|
return users, err
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"users_management/m/model/dto/res"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func SingleResponses(ctx *gin.Context, description string, data any) {
|
||||||
|
ctx.JSON(http.StatusOK, res.SingleResponses{
|
||||||
|
Status: res.Status{
|
||||||
|
Code: http.StatusCreated,
|
||||||
|
Description: description,
|
||||||
|
},
|
||||||
|
Data: data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func ErrorResponses(ctx *gin.Context, code int, description string) {
|
||||||
|
ctx.JSON(code, res.SingleResponses{
|
||||||
|
Status: res.Status{
|
||||||
|
Code: code,
|
||||||
|
Description: description,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func LoggingToFile() gin.HandlerFunc {
|
||||||
|
logFile, err := os.OpenFile("gin.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
panic("Failed to open log file: " + err.Error())
|
||||||
|
}
|
||||||
|
gin.DefaultWriter = logFile
|
||||||
|
return gin.Logger()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
package utils
|
||||||
|
|
||||||
|
import "golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
|
func HashPassword(password string) (string, error) {
|
||||||
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
password = string(hash)
|
||||||
|
return password, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckPasswordHash(password, hash string) bool {
|
||||||
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue