code implemed and not finishing yet
This commit is contained in:
parent
21d4f28cef
commit
14d9c9c563
|
@ -1,10 +1,11 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/router"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/cors"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/router"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
|
|
@ -5,7 +5,8 @@ import (
|
|||
"log"
|
||||
"os"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/driver/postgres"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
|
147
dto/auth_dto.go
147
dto/auth_dto.go
|
@ -15,35 +15,22 @@ type VerifyOTPRequest struct {
|
|||
OTP string `json:"otp"`
|
||||
}
|
||||
|
||||
type MetaResponse struct {
|
||||
Status int `json:"status"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
// UserDataResponse untuk bagian data
|
||||
type UserDataResponse struct {
|
||||
UserID string `json:"user_id"`
|
||||
UserRole string `json:"user_role"`
|
||||
Token string `json:"token"`
|
||||
}
|
||||
|
||||
// Response struct utama
|
||||
type Response struct {
|
||||
Meta MetaResponse `json:"meta"`
|
||||
Data *UserDataResponse `json:"data,omitempty"` // Gunakan pointer agar bisa bernilai nil jika tidak diperlukan
|
||||
}
|
||||
|
||||
func (l *RegisterRequest) Validate() (map[string][]string, bool) {
|
||||
func (r *RegisterRequest) Validate() (map[string][]string, bool) {
|
||||
errors := make(map[string][]string)
|
||||
|
||||
// Validasi RoleID dan Phone
|
||||
if strings.TrimSpace(l.RoleID) == "" {
|
||||
errors["roleid"] = append(errors["roleid"], "Role ID is required")
|
||||
if strings.TrimSpace(r.RoleID) == "" {
|
||||
errors["role_id"] = append(errors["role_id"], "Role ID is required")
|
||||
}
|
||||
|
||||
if strings.TrimSpace(l.Phone) == "" {
|
||||
if strings.TrimSpace(r.Phone) == "" {
|
||||
errors["phone"] = append(errors["phone"], "Phone is required")
|
||||
} else if !IsValidPhoneNumber(l.Phone) {
|
||||
} else if !IsValidPhoneNumber(r.Phone) {
|
||||
errors["phone"] = append(errors["phone"], "Invalid phone number format. Use 62 followed by 9-13 digits")
|
||||
}
|
||||
|
||||
|
@ -53,131 +40,7 @@ func (l *RegisterRequest) Validate() (map[string][]string, bool) {
|
|||
return nil, true
|
||||
}
|
||||
|
||||
// IsValidPhoneNumber untuk validasi format nomor telepon
|
||||
func IsValidPhoneNumber(phone string) bool {
|
||||
// Validasi format nomor telepon harus dimulai dengan 62 dan 9-13 digit setelahnya
|
||||
re := regexp.MustCompile(`^62\d{9,13}$`)
|
||||
return re.MatchString(phone)
|
||||
}
|
||||
|
||||
// package dto
|
||||
|
||||
// import (
|
||||
// "regexp"
|
||||
// "strings"
|
||||
// )
|
||||
|
||||
// type LoginDTO struct {
|
||||
// RoleID string `json:"roleid"`
|
||||
// Identifier string `json:"identifier"`
|
||||
// Password string `json:"password"`
|
||||
// }
|
||||
|
||||
// type UserResponseWithToken struct {
|
||||
// UserID string `json:"user_id"`
|
||||
// RoleName string `json:"role_name"`
|
||||
// Token string `json:"token"`
|
||||
// }
|
||||
|
||||
// type RegisterDTO struct {
|
||||
// Username string `json:"username"`
|
||||
// Name string `json:"name"`
|
||||
// Phone string `json:"phone"`
|
||||
// Email string `json:"email"`
|
||||
// Password string `json:"password"`
|
||||
// ConfirmPassword string `json:"confirm_password"`
|
||||
// RoleID string `json:"roleId,omitempty"`
|
||||
// }
|
||||
|
||||
// func (l *LoginDTO) Validate() (map[string][]string, bool) {
|
||||
// errors := make(map[string][]string)
|
||||
|
||||
// if strings.TrimSpace(l.RoleID) == "" {
|
||||
// errors["roleid"] = append(errors["roleid"], "Role ID is required")
|
||||
// }
|
||||
// if strings.TrimSpace(l.Identifier) == "" {
|
||||
// errors["identifier"] = append(errors["identifier"], "Identifier (username, email, or phone) is required")
|
||||
// }
|
||||
// if strings.TrimSpace(l.Password) == "" {
|
||||
// errors["password"] = append(errors["password"], "Password is required")
|
||||
// }
|
||||
|
||||
// if len(errors) > 0 {
|
||||
// return errors, false
|
||||
// }
|
||||
// return nil, true
|
||||
// }
|
||||
|
||||
// func (r *RegisterDTO) Validate() (map[string][]string, bool) {
|
||||
// errors := make(map[string][]string)
|
||||
|
||||
// r.validateRequiredFields(errors)
|
||||
|
||||
// if r.Phone != "" && !IsValidPhoneNumber(r.Phone) {
|
||||
// errors["phone"] = append(errors["phone"], "Invalid phone number format. Use +62 followed by 9-13 digits")
|
||||
// }
|
||||
|
||||
// if r.Email != "" && !IsValidEmail(r.Email) {
|
||||
// errors["email"] = append(errors["email"], "Invalid email format")
|
||||
// }
|
||||
|
||||
// if r.Password != "" && !IsValidPassword(r.Password) {
|
||||
// errors["password"] = append(errors["password"], "Password must be at least 8 characters long and contain at least one number")
|
||||
// }
|
||||
|
||||
// if r.ConfirmPassword != "" && r.Password != r.ConfirmPassword {
|
||||
// errors["confirm_password"] = append(errors["confirm_password"], "Password and confirm password do not match")
|
||||
// }
|
||||
|
||||
// if len(errors) > 0 {
|
||||
// return errors, false
|
||||
// }
|
||||
|
||||
// return nil, true
|
||||
// }
|
||||
|
||||
// func (r *RegisterDTO) validateRequiredFields(errors map[string][]string) {
|
||||
|
||||
// if strings.TrimSpace(r.Username) == "" {
|
||||
// errors["username"] = append(errors["username"], "Username is required")
|
||||
// }
|
||||
// if strings.TrimSpace(r.Name) == "" {
|
||||
// errors["name"] = append(errors["name"], "Name is required")
|
||||
// }
|
||||
// if strings.TrimSpace(r.Phone) == "" {
|
||||
// errors["phone"] = append(errors["phone"], "Phone number is required")
|
||||
// }
|
||||
// if strings.TrimSpace(r.Email) == "" {
|
||||
// errors["email"] = append(errors["email"], "Email is required")
|
||||
// }
|
||||
// if strings.TrimSpace(r.Password) == "" {
|
||||
// errors["password"] = append(errors["password"], "Password is required")
|
||||
// }
|
||||
// if strings.TrimSpace(r.ConfirmPassword) == "" {
|
||||
// errors["confirm_password"] = append(errors["confirm_password"], "Confirm password is required")
|
||||
// }
|
||||
// if strings.TrimSpace(r.RoleID) == "" {
|
||||
// errors["roleId"] = append(errors["roleId"], "RoleID is required")
|
||||
// }
|
||||
// }
|
||||
|
||||
// func IsValidPhoneNumber(phone string) bool {
|
||||
|
||||
// re := regexp.MustCompile(`^\+62\d{9,13}$`)
|
||||
// return re.MatchString(phone)
|
||||
// }
|
||||
|
||||
// func IsValidEmail(email string) bool {
|
||||
|
||||
// re := regexp.MustCompile(`^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`)
|
||||
// return re.MatchString(email)
|
||||
// }
|
||||
|
||||
// func IsValidPassword(password string) bool {
|
||||
// if len(password) < 8 {
|
||||
// return false
|
||||
// }
|
||||
|
||||
// re := regexp.MustCompile(`\d`)
|
||||
// return re.MatchString(password)
|
||||
// }
|
||||
|
|
2
go.mod
2
go.mod
|
@ -1,4 +1,4 @@
|
|||
module github.com/pahmiudahgede/senggoldong
|
||||
module rijig
|
||||
|
||||
go 1.23.3
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type AddressHandler struct {
|
||||
|
|
|
@ -5,10 +5,11 @@ import (
|
|||
"mime/multipart"
|
||||
"strconv"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type ArticleHandler struct {
|
||||
|
|
|
@ -1,88 +1,53 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
)
|
||||
|
||||
type AuthHandler struct {
|
||||
AuthService services.AuthService
|
||||
authService services.AuthService
|
||||
}
|
||||
|
||||
func NewAuthHandler(authService services.AuthService) *AuthHandler {
|
||||
return &AuthHandler{AuthService: authService}
|
||||
return &AuthHandler{
|
||||
authService: authService,
|
||||
}
|
||||
}
|
||||
|
||||
func (h *AuthHandler) Register(c *fiber.Ctx) error {
|
||||
var request dto.RegisterRequest
|
||||
|
||||
if err := c.BodyParser(&request); err != nil {
|
||||
return c.Status(400).SendString("Invalid input")
|
||||
return utils.ValidationErrorResponse(c, map[string][]string{"body": {"invalid request body"}})
|
||||
}
|
||||
|
||||
if errors, valid := request.Validate(); !valid {
|
||||
return c.Status(400).JSON(errors)
|
||||
return utils.ValidationErrorResponse(c, errors)
|
||||
}
|
||||
|
||||
_, err := h.AuthService.RegisterUser(request)
|
||||
err := h.authService.RegisterUser(&request)
|
||||
if err != nil {
|
||||
return c.Status(500).SendString(err.Error())
|
||||
return utils.ErrorResponse(c, err.Error())
|
||||
}
|
||||
|
||||
return c.Status(201).JSON(fiber.Map{
|
||||
"meta": fiber.Map{
|
||||
"status": 201,
|
||||
"message": "The input register from the user has been successfully recorded. Please check the otp code sent to your number.",
|
||||
},
|
||||
})
|
||||
return utils.SuccessResponse(c, nil, "OTP has been sent to your phone")
|
||||
}
|
||||
|
||||
func (h *AuthHandler) VerifyOTP(c *fiber.Ctx) error {
|
||||
var request struct {
|
||||
Phone string `json:"phone"`
|
||||
OTP string `json:"otp"`
|
||||
}
|
||||
var request dto.VerifyOTPRequest
|
||||
|
||||
if err := c.BodyParser(&request); err != nil {
|
||||
return c.Status(400).SendString("Invalid input")
|
||||
return utils.ValidationErrorResponse(c, map[string][]string{"body": {"invalid request body"}})
|
||||
}
|
||||
|
||||
err := h.AuthService.VerifyOTP(request.Phone, request.OTP)
|
||||
err := h.authService.VerifyOTP(&request)
|
||||
if err != nil {
|
||||
return c.Status(400).JSON(dto.Response{
|
||||
Meta: dto.MetaResponse{
|
||||
Status: 400,
|
||||
Message: "Invalid OTP",
|
||||
},
|
||||
Data: nil,
|
||||
})
|
||||
return utils.ErrorResponse(c, err.Error())
|
||||
}
|
||||
|
||||
user, err := h.AuthService.GetUserByPhone(request.Phone)
|
||||
if err != nil {
|
||||
return c.Status(500).SendString("Error retrieving user")
|
||||
}
|
||||
if user == nil {
|
||||
return c.Status(404).SendString("User not found")
|
||||
}
|
||||
|
||||
token, err := h.AuthService.GenerateJWT(user)
|
||||
if err != nil {
|
||||
return c.Status(500).SendString("Error generating token")
|
||||
}
|
||||
|
||||
response := dto.Response{
|
||||
Meta: dto.MetaResponse{
|
||||
Status: 200,
|
||||
Message: "OTP yang dimasukkan valid",
|
||||
},
|
||||
Data: &dto.UserDataResponse{
|
||||
UserID: user.ID,
|
||||
UserRole: user.Role.RoleName,
|
||||
Token: token,
|
||||
},
|
||||
}
|
||||
|
||||
return c.Status(200).JSON(response)
|
||||
return utils.SuccessResponse(c, nil, "User successfully registered")
|
||||
}
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type BannerHandler struct {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type InitialCointHandler struct {
|
||||
|
|
|
@ -5,10 +5,11 @@ import (
|
|||
"log"
|
||||
"strconv"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type ProductHandler struct {
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type RoleHandler struct {
|
||||
|
|
|
@ -3,10 +3,11 @@ package handler
|
|||
import (
|
||||
"log"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type StoreHandler struct {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type TrashHandler struct {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type UserProfileHandler struct {
|
||||
|
@ -30,7 +31,6 @@ func (h *UserProfileHandler) GetUserProfile(c *fiber.Ctx) error {
|
|||
return utils.SuccessResponse(c, userProfile, "User profile retrieved successfully")
|
||||
}
|
||||
|
||||
|
||||
func (h *UserProfileHandler) GetUserProfileById(c *fiber.Ctx) error {
|
||||
userID := c.Params("userid")
|
||||
if userID == "" {
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
package handler
|
||||
|
||||
import (
|
||||
"rijig/dto"
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type UserPinHandler struct {
|
||||
|
|
|
@ -3,9 +3,10 @@ package handler
|
|||
import (
|
||||
"strconv"
|
||||
|
||||
"rijig/internal/services"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type WilayahIndonesiaHandler struct {
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
@ -25,7 +26,6 @@ func (r *addressRepository) CreateAddress(address *model.Address) error {
|
|||
return r.DB.Create(address).Error
|
||||
}
|
||||
|
||||
|
||||
func (r *addressRepository) FindAddressByUserID(userID string) ([]model.Address, error) {
|
||||
var addresses []model.Address
|
||||
err := r.DB.Where("user_id = ?", userID).Find(&addresses).Error
|
||||
|
|
|
@ -3,7 +3,8 @@ package repositories
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,29 +1,40 @@
|
|||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"rijig/model"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type UserRepository interface {
|
||||
SaveUser(user *model.User) (*model.User, error)
|
||||
FindByPhone(phone string) (*model.User, error)
|
||||
FindByPhoneAndRole(phone, roleID string) (*model.User, error)
|
||||
CreateUser(user *model.User) error
|
||||
}
|
||||
|
||||
type userRepository struct {
|
||||
DB *gorm.DB
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
func NewUserRepository(db *gorm.DB) UserRepository {
|
||||
return &userRepository{DB: db}
|
||||
return &userRepository{db: db}
|
||||
}
|
||||
|
||||
func (r *userRepository) SaveUser(user *model.User) (*model.User, error) {
|
||||
if err := r.db.Create(user).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (r *userRepository) FindByPhone(phone string) (*model.User, error) {
|
||||
var user model.User
|
||||
|
||||
err := r.DB.Preload("Role").Where("phone = ?", phone).First(&user).Error
|
||||
if err != nil {
|
||||
if err := r.db.Where("phone = ?", phone).First(&user).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
return nil, nil
|
||||
}
|
||||
|
@ -32,15 +43,62 @@ func (r *userRepository) FindByPhone(phone string) (*model.User, error) {
|
|||
return &user, nil
|
||||
}
|
||||
|
||||
func (r *userRepository) FindByPhoneAndRole(phone, roleID string) (*model.User, error) {
|
||||
var user model.User
|
||||
err := r.DB.Where("phone = ? AND role_id = ?", phone, roleID).First(&user).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &user, nil
|
||||
type RedisRepository interface {
|
||||
StoreData(key string, data interface{}, expiration time.Duration) error
|
||||
GetData(key string) (interface{}, error) // Mengembalikan interface{}
|
||||
DeleteData(key string) error
|
||||
}
|
||||
|
||||
func (r *userRepository) CreateUser(user *model.User) error {
|
||||
return r.DB.Create(user).Error
|
||||
type redisRepository struct {
|
||||
client *redis.Client
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
// NewRedisRepository membuat instance baru dari redisRepository
|
||||
func NewRedisRepository(client *redis.Client) RedisRepository {
|
||||
return &redisRepository{
|
||||
client: client,
|
||||
ctx: context.Background(),
|
||||
}
|
||||
}
|
||||
|
||||
// StoreData menyimpan data ke dalam Redis (dalam format JSON)
|
||||
func (r *redisRepository) StoreData(key string, data interface{}, expiration time.Duration) error {
|
||||
// Marshaling data ke JSON
|
||||
jsonData, err := json.Marshal(data)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to marshal data: %v", err)
|
||||
}
|
||||
|
||||
// Simpan JSON ke Redis
|
||||
err = r.client.Set(r.ctx, key, jsonData, expiration).Err()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to store data in Redis: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetData mengambil data dari Redis berdasarkan key
|
||||
func (r *redisRepository) GetData(key string) (interface{}, error) {
|
||||
val, err := r.client.Get(r.ctx, key).Result()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get data from Redis: %v", err)
|
||||
}
|
||||
|
||||
// Unmarshal data JSON kembali ke objek
|
||||
var data interface{}
|
||||
err = json.Unmarshal([]byte(val), &data)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to unmarshal data: %v", err)
|
||||
}
|
||||
return data, nil
|
||||
}
|
||||
|
||||
// DeleteData menghapus data di Redis berdasarkan key
|
||||
func (r *redisRepository) DeleteData(key string) error {
|
||||
err := r.client.Del(r.ctx, key).Err()
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete data from Redis: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -3,7 +3,8 @@ package repositories
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@ package repositories
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -3,7 +3,8 @@ package repositories
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -3,7 +3,8 @@ package repositories
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -3,7 +3,8 @@ package repositories
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -3,7 +3,8 @@ package repositories
|
|||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
package repositories
|
||||
|
||||
import (
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"rijig/model"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
|
|
|
@ -4,10 +4,10 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
)
|
||||
|
||||
type AddressService interface {
|
||||
|
|
|
@ -8,11 +8,12 @@ import (
|
|||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type ArticleService interface {
|
||||
|
|
|
@ -1,103 +1,127 @@
|
|||
package services
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"math/rand"
|
||||
|
||||
"rijig/config"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
)
|
||||
|
||||
type AuthService interface {
|
||||
RegisterUser(request dto.RegisterRequest) (*model.User, error)
|
||||
VerifyOTP(phone, otp string) error
|
||||
GetUserByPhone(phone string) (*model.User, error)
|
||||
GenerateJWT(user *model.User) (string, error)
|
||||
RegisterUser(request *dto.RegisterRequest) error
|
||||
VerifyOTP(request *dto.VerifyOTPRequest) error
|
||||
}
|
||||
|
||||
type authService struct {
|
||||
UserRepo repositories.UserRepository
|
||||
userRepo repositories.UserRepository
|
||||
roleRepo repositories.RoleRepository
|
||||
redisRepo repositories.RedisRepository
|
||||
}
|
||||
|
||||
func NewAuthService(userRepo repositories.UserRepository) AuthService {
|
||||
return &authService{UserRepo: userRepo}
|
||||
func NewAuthService(userRepo repositories.UserRepository, roleRepo repositories.RoleRepository, redisRepo repositories.RedisRepository) AuthService {
|
||||
return &authService{
|
||||
userRepo: userRepo,
|
||||
roleRepo: roleRepo,
|
||||
redisRepo: redisRepo,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *authService) RegisterUser(request dto.RegisterRequest) (*model.User, error) {
|
||||
func (s *authService) RegisterUser(request *dto.RegisterRequest) error {
|
||||
|
||||
user, err := s.UserRepo.FindByPhone(request.Phone)
|
||||
if err == nil && user != nil {
|
||||
return nil, fmt.Errorf("user with phone %s already exists", request.Phone)
|
||||
if request.RoleID == "" {
|
||||
return fmt.Errorf("role_id cannot be empty")
|
||||
}
|
||||
|
||||
user = &model.User{
|
||||
role, err := s.roleRepo.FindByID(request.RoleID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("role not found: %v", err)
|
||||
}
|
||||
if role == nil {
|
||||
return fmt.Errorf("role with ID %s not found", request.RoleID)
|
||||
}
|
||||
|
||||
existingUser, err := s.userRepo.FindByPhone(request.Phone)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to check existing user: %v", err)
|
||||
}
|
||||
if existingUser != nil {
|
||||
return fmt.Errorf("phone number already registered")
|
||||
}
|
||||
|
||||
temporaryData := &model.User{
|
||||
Phone: request.Phone,
|
||||
RoleID: request.RoleID,
|
||||
EmailVerified: false,
|
||||
}
|
||||
|
||||
err = s.UserRepo.CreateUser(user)
|
||||
err = s.redisRepo.StoreData(request.Phone, temporaryData, 1*time.Hour)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create user: %v", err)
|
||||
return fmt.Errorf("failed to store registration data in Redis: %v", err)
|
||||
}
|
||||
|
||||
_, err = s.SendOTP(request.Phone)
|
||||
otp := generateOTP()
|
||||
err = s.redisRepo.StoreData("otp:"+request.Phone, otp, 10*time.Minute)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to send OTP: %v", err)
|
||||
return fmt.Errorf("failed to store OTP in Redis: %v", err)
|
||||
}
|
||||
|
||||
return user, nil
|
||||
err = config.SendWhatsAppMessage(request.Phone, fmt.Sprintf("Your OTP is: %s", otp))
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to send OTP via WhatsApp: %v", err)
|
||||
}
|
||||
|
||||
log.Printf("OTP sent to phone number: %s", request.Phone)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *authService) GetUserByPhone(phone string) (*model.User, error) {
|
||||
user, err := s.UserRepo.FindByPhone(phone)
|
||||
func (s *authService) VerifyOTP(request *dto.VerifyOTPRequest) error {
|
||||
|
||||
storedOTP, err := s.redisRepo.GetData("otp:" + request.Phone)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error retrieving user by phone: %v", err)
|
||||
}
|
||||
if user == nil {
|
||||
return nil, fmt.Errorf("user not found")
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (s *authService) SendOTP(phone string) (string, error) {
|
||||
otpCode := generateOTP()
|
||||
|
||||
message := fmt.Sprintf("Your OTP code is: %s", otpCode)
|
||||
err := config.SendWhatsAppMessage(phone, message)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to send OTP via WhatsApp: %v", err)
|
||||
}
|
||||
|
||||
expirationTime := 5 * time.Minute
|
||||
err = config.RedisClient.Set(config.Ctx, phone, otpCode, expirationTime).Err()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to store OTP in Redis: %v", err)
|
||||
}
|
||||
|
||||
return otpCode, nil
|
||||
}
|
||||
|
||||
func (s *authService) VerifyOTP(phone, otp string) error {
|
||||
|
||||
otpRecord, err := config.RedisClient.Get(config.Ctx, phone).Result()
|
||||
if err == redis.Nil {
|
||||
|
||||
return fmt.Errorf("OTP not found or expired")
|
||||
} else if err != nil {
|
||||
|
||||
return fmt.Errorf("failed to retrieve OTP from Redis: %v", err)
|
||||
}
|
||||
|
||||
if otp != otpRecord {
|
||||
if storedOTP != request.OTP {
|
||||
return fmt.Errorf("invalid OTP")
|
||||
}
|
||||
|
||||
err = config.RedisClient.Del(config.Ctx, phone).Err()
|
||||
temporaryData, err := s.redisRepo.GetData(request.Phone)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get registration data from Redis: %v", err)
|
||||
}
|
||||
if temporaryData == "" {
|
||||
return fmt.Errorf("no registration data found for phone: %s", request.Phone)
|
||||
}
|
||||
|
||||
temporaryDataStr, ok := temporaryData.(string)
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to assert data to string")
|
||||
}
|
||||
|
||||
temporaryDataBytes := []byte(temporaryDataStr)
|
||||
|
||||
var user model.User
|
||||
err = json.Unmarshal(temporaryDataBytes, &user)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to unmarshal registration data: %v", err)
|
||||
}
|
||||
|
||||
_, err = s.userRepo.SaveUser(&user)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to save user to database: %v", err)
|
||||
}
|
||||
|
||||
err = s.redisRepo.DeleteData(request.Phone)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete registration data from Redis: %v", err)
|
||||
}
|
||||
|
||||
err = s.redisRepo.DeleteData("otp:" + request.Phone)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete OTP from Redis: %v", err)
|
||||
}
|
||||
|
@ -105,30 +129,12 @@ func (s *authService) VerifyOTP(phone, otp string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (s *authService) GenerateJWT(user *model.User) (string, error) {
|
||||
if user == nil || user.Role == nil {
|
||||
return "", fmt.Errorf("user or user role is nil, cannot generate token")
|
||||
}
|
||||
|
||||
claims := jwt.MapClaims{
|
||||
"sub": user.ID,
|
||||
"role": user.Role.RoleName,
|
||||
"iat": time.Now().Unix(),
|
||||
"exp": time.Now().Add(time.Hour * 24).Unix(),
|
||||
}
|
||||
|
||||
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
|
||||
secretKey := config.GetSecretKey()
|
||||
|
||||
tokenString, err := token.SignedString([]byte(secretKey))
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("failed to generate JWT token: %v", err)
|
||||
}
|
||||
|
||||
return tokenString, nil
|
||||
}
|
||||
|
||||
func generateOTP() string {
|
||||
return fmt.Sprintf("%06d", time.Now().UnixNano()%1000000)
|
||||
|
||||
return fmt.Sprintf("%06d", RandomInt(100000, 999999))
|
||||
}
|
||||
|
||||
func RandomInt(min, max int) int {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
return rand.Intn(max-min+1) + min
|
||||
}
|
||||
|
|
|
@ -7,11 +7,12 @@ import (
|
|||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type BannerService interface {
|
||||
|
|
|
@ -4,10 +4,10 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
)
|
||||
|
||||
type InitialCointService interface {
|
||||
|
|
|
@ -6,11 +6,12 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type ProductService interface {
|
||||
|
|
|
@ -4,9 +4,9 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/utils"
|
||||
)
|
||||
|
||||
type RoleService interface {
|
||||
|
|
|
@ -6,11 +6,12 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
type StoreService interface {
|
||||
|
@ -237,7 +238,7 @@ func (s *storeService) DeleteStore(storeID string) error {
|
|||
|
||||
func (s *storeService) saveStoreImage(file *multipart.FileHeader, imageType string) (string, error) {
|
||||
|
||||
imageDir := fmt.Sprintf("./public%s/uploads/store/%s",os.Getenv("BASE_URL"), imageType)
|
||||
imageDir := fmt.Sprintf("./public%s/uploads/store/%s", os.Getenv("BASE_URL"), imageType)
|
||||
if _, err := os.Stat(imageDir); os.IsNotExist(err) {
|
||||
|
||||
if err := os.MkdirAll(imageDir, os.ModePerm); err != nil {
|
||||
|
|
|
@ -4,10 +4,10 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
)
|
||||
|
||||
type TrashService interface {
|
||||
|
|
|
@ -10,10 +10,10 @@ import (
|
|||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
// "golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
|
@ -155,12 +155,12 @@ func (s *userProfileService) UpdateUserProfile(userID string, updateData dto.Upd
|
|||
user.Name = updateData.Name
|
||||
}
|
||||
|
||||
if updateData.Phone != "" && updateData.Phone != user.Phone {
|
||||
if err := s.updatePhoneIfNeeded(user, updateData.Phone); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user.Phone = updateData.Phone
|
||||
}
|
||||
// if updateData.Phone != "" && updateData.Phone != user.Phone {
|
||||
// if err := s.updatePhoneIfNeeded(user, updateData.Phone); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
// user.Phone = updateData.Phone
|
||||
// }
|
||||
|
||||
// if updateData.Email != "" && updateData.Email != user.Email {
|
||||
// if err := s.updateEmailIfNeeded(user, updateData.Email); err != nil {
|
||||
|
@ -188,13 +188,13 @@ func (s *userProfileService) UpdateUserProfile(userID string, updateData dto.Upd
|
|||
return userResponse, nil
|
||||
}
|
||||
|
||||
func (s *userProfileService) updatePhoneIfNeeded(user *model.User, newPhone string) error {
|
||||
existingPhone, _ := s.UserRepo.FindByPhoneAndRole(newPhone, user.RoleID)
|
||||
if existingPhone != nil {
|
||||
return fmt.Errorf("phone number is already used for this role")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
// func (s *userProfileService) updatePhoneIfNeeded(user *model.User, newPhone string) error {
|
||||
// existingPhone, _ := s.UserRepo.FindByPhoneAndRole(newPhone, user.RoleID)
|
||||
// if existingPhone != nil {
|
||||
// return fmt.Errorf("phone number is already used for this role")
|
||||
// }
|
||||
// return nil
|
||||
// }
|
||||
|
||||
// func (s *userProfileService) updateEmailIfNeeded(user *model.User, newEmail string) error {
|
||||
// existingEmail, _ := s.UserRepo.FindByEmailAndRole(newEmail, user.RoleID)
|
||||
|
|
|
@ -4,9 +4,10 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
|
|
|
@ -6,10 +6,10 @@ import (
|
|||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/pahmiudahgede/senggoldong/dto"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/model"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
"rijig/dto"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/model"
|
||||
"rijig/utils"
|
||||
)
|
||||
|
||||
type WilayahIndonesiaService interface {
|
||||
|
|
|
@ -3,8 +3,9 @@ package middleware
|
|||
import (
|
||||
"os"
|
||||
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func APIKeyMiddleware(c *fiber.Ctx) error {
|
||||
|
|
|
@ -3,9 +3,10 @@ package middleware
|
|||
import (
|
||||
"os"
|
||||
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func AuthMiddleware(c *fiber.Ctx) error {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package middleware
|
||||
|
||||
import (
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func RoleMiddleware(allowedRoles ...string) fiber.Handler {
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
)
|
||||
|
||||
func AddressRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func ArticleRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
// "gorm.io/gorm"
|
||||
// "github.com/pahmiudahgede/senggoldong/middleware"
|
||||
// "rijig/middleware"
|
||||
)
|
||||
|
||||
func AuthRouter(api fiber.Router) {
|
||||
|
@ -29,12 +30,25 @@ func AuthRouter(api fiber.Router) {
|
|||
// authRoutes := api.Group("/auth")
|
||||
// authRoutes.Post("/send-otp", authHandler.SendOTP)
|
||||
// authRoutes.Post("/verify-otp", authHandler.VerifyOTP)
|
||||
userRepo := repositories.NewUserRepository(config.DB)
|
||||
authService := services.NewAuthService(userRepo)
|
||||
// userRepo := repositories.NewUserRepository(config.DB)
|
||||
// authService := services.NewAuthService(userRepo)
|
||||
|
||||
// authHandler := handler.NewAuthHandler(authService)
|
||||
|
||||
// // Routes
|
||||
// api.Post("/register", authHandler.Register)
|
||||
// api.Post("/verify-otp", authHandler.VerifyOTP)
|
||||
userRepo := repositories.NewUserRepository(config.DB)
|
||||
roleRepo := repositories.NewRoleRepository(config.DB)
|
||||
redisRepo := repositories.NewRedisRepository(config.RedisClient)
|
||||
|
||||
// Setup Service
|
||||
authService := services.NewAuthService(userRepo, roleRepo, redisRepo)
|
||||
|
||||
// Setup Handler
|
||||
authHandler := handler.NewAuthHandler(authService)
|
||||
|
||||
// Routes
|
||||
api.Post("/register", authHandler.Register)
|
||||
// Define Routes
|
||||
api.Post("/register", authHandler.Register) // Route untuk registrasi
|
||||
api.Post("/verify-otp", authHandler.VerifyOTP)
|
||||
}
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func BannerRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func InitialCointRoute(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func ProductRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
)
|
||||
|
||||
func RoleRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func StoreRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func TrashRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
)
|
||||
|
||||
func UserProfileRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
)
|
||||
|
||||
func UserPinRouter(api fiber.Router) {
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
package presentation
|
||||
|
||||
import (
|
||||
"rijig/config"
|
||||
"rijig/internal/handler"
|
||||
"rijig/internal/repositories"
|
||||
"rijig/internal/services"
|
||||
"rijig/middleware"
|
||||
"rijig/utils"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/handler"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/repositories"
|
||||
"github.com/pahmiudahgede/senggoldong/internal/services"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/utils"
|
||||
)
|
||||
|
||||
func WilayahRouter(api fiber.Router) {
|
||||
|
@ -16,20 +17,20 @@ func WilayahRouter(api fiber.Router) {
|
|||
wilayahService := services.NewWilayahIndonesiaService(wilayahRepo)
|
||||
wilayahHandler := handler.NewWilayahImportHandler(wilayahService)
|
||||
|
||||
api.Post("/import/data-wilayah-indonesia", middleware.AuthMiddleware, middleware.RoleMiddleware(utils.RoleAdministrator), wilayahHandler.ImportWilayahData)
|
||||
api.Post("/import/data-wilayah-indonesia", middleware.RoleMiddleware(utils.RoleAdministrator), wilayahHandler.ImportWilayahData)
|
||||
|
||||
wilayahAPI := api.Group("/wilayah-indonesia")
|
||||
|
||||
wilayahAPI.Get("/provinces", middleware.AuthMiddleware, wilayahHandler.GetProvinces)
|
||||
wilayahAPI.Get("/provinces/:provinceid", middleware.AuthMiddleware, wilayahHandler.GetProvinceByID)
|
||||
wilayahAPI.Get("/provinces", wilayahHandler.GetProvinces)
|
||||
wilayahAPI.Get("/provinces/:provinceid", wilayahHandler.GetProvinceByID)
|
||||
|
||||
wilayahAPI.Get("/regencies", middleware.AuthMiddleware, wilayahHandler.GetAllRegencies)
|
||||
wilayahAPI.Get("/regencies/:regencyid", middleware.AuthMiddleware, wilayahHandler.GetRegencyByID)
|
||||
wilayahAPI.Get("/regencies", wilayahHandler.GetAllRegencies)
|
||||
wilayahAPI.Get("/regencies/:regencyid", wilayahHandler.GetRegencyByID)
|
||||
|
||||
wilayahAPI.Get("/districts", middleware.AuthMiddleware, wilayahHandler.GetAllDistricts)
|
||||
wilayahAPI.Get("/districts/:districtid", middleware.AuthMiddleware, wilayahHandler.GetDistrictByID)
|
||||
wilayahAPI.Get("/districts", wilayahHandler.GetAllDistricts)
|
||||
wilayahAPI.Get("/districts/:districtid", wilayahHandler.GetDistrictByID)
|
||||
|
||||
wilayahAPI.Get("/villages", middleware.AuthMiddleware, wilayahHandler.GetAllVillages)
|
||||
wilayahAPI.Get("/villages/:villageid", middleware.AuthMiddleware, wilayahHandler.GetVillageByID)
|
||||
wilayahAPI.Get("/villages", wilayahHandler.GetAllVillages)
|
||||
wilayahAPI.Get("/villages/:villageid", wilayahHandler.GetVillageByID)
|
||||
|
||||
}
|
||||
|
|
|
@ -3,9 +3,10 @@ package router
|
|||
import (
|
||||
"os"
|
||||
|
||||
"rijig/middleware"
|
||||
"rijig/presentation"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/pahmiudahgede/senggoldong/middleware"
|
||||
"github.com/pahmiudahgede/senggoldong/presentation"
|
||||
)
|
||||
|
||||
func SetupRoutes(app *fiber.App) {
|
||||
|
|
|
@ -7,8 +7,9 @@ import (
|
|||
"log"
|
||||
"time"
|
||||
|
||||
"rijig/config"
|
||||
|
||||
"github.com/go-redis/redis/v8"
|
||||
"github.com/pahmiudahgede/senggoldong/config"
|
||||
)
|
||||
|
||||
var ctx = context.Background()
|
||||
|
|
Loading…
Reference in New Issue