Add User route and Refactor code

This commit is contained in:
Kenta420 2023-12-06 20:21:25 +07:00
parent 519749fd3a
commit b311a41dc7
24 changed files with 902 additions and 489 deletions

View file

@ -2,76 +2,66 @@ package logger
import (
"os"
"recipe-manager/config"
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
var (
log_inst = _NewLogger()
type TaoLogger struct {
cfg *config.ServerConfig
enableDebug bool
Log *zap.Logger
}
enable_debug = false
log_level = zap.NewAtomicLevel()
func (tl *TaoLogger) initConfig() *zap.Logger {
log_file_config = zapcore.AddSync(&lumberjack.Logger{
Filename: "services/logger/serverlog.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
LocalTime: true,
})
json_enc = zapcore.NewJSONEncoder(zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "error",
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
})
console_enc = zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "error",
EncodeLevel: zapcore.CapitalColorLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
})
)
func createLogggerConfig() *zap.Logger {
enable_debug_mode := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zap.InfoLevel || enable_debug
enableDebugMode := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zap.InfoLevel || tl.enableDebug
})
log_core := zapcore.NewTee(
zapcore.NewCore(json_enc, log_file_config, enable_debug_mode),
zapcore.NewCore(console_enc, zapcore.AddSync(os.Stdout), enable_debug_mode),
logCore := zapcore.NewTee(
zapcore.NewCore(zapcore.NewJSONEncoder(zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "error",
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
}), zapcore.AddSync(&lumberjack.Logger{
Filename: "services/logger/serverlog.log",
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
LocalTime: true,
}), enableDebugMode),
zapcore.NewCore(zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
TimeKey: "timestamp",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
MessageKey: "message",
StacktraceKey: "error",
EncodeLevel: zapcore.CapitalColorLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
}), zapcore.AddSync(os.Stdout), enableDebugMode),
)
return zap.New(log_core)
return zap.New(logCore)
}
func _NewLogger() *zap.Logger {
log := createLogggerConfig()
defer log.Sync()
return log
}
func NewTaoLogger(cfg *config.ServerConfig) *TaoLogger {
logger := &TaoLogger{cfg, false, nil}
logger.Log = logger.initConfig()
func GetInstance() *zap.Logger {
return log_inst
}
if cfg.Debug {
// logger.SetLevel("DEBUG")
logger.Log.Debug("Debug mode", zap.Bool("enable", cfg.Debug))
logger.enableDebug = true
}
func EnableDebug(state bool) {
enable_debug = state
log_inst.Debug("EnableDebug", zap.Bool("enable", state))
}
func GetDbgState() bool {
return enable_debug
return logger
}

View file

@ -78,7 +78,9 @@ func (o *oauthService) GetUserInfo(ctx context.Context, token *oauth2.Token) (*m
defer resp.Body.Close()
var userInfo map[string]interface{}
json.NewDecoder(resp.Body).Decode(&userInfo)
if err := json.NewDecoder(resp.Body).Decode(&userInfo); err != nil {
return nil, err
}
if userInfo["error"] != nil {
return nil, errors.New("Error getting user info")

View file

@ -0,0 +1,9 @@
package queries
const (
GetUserByID = "SELECT id, name, email, picture, permissions FROM users WHERE id = ?"
GetUserByEmail = "SELECT id, name, email, picture, permissions FROM users WHERE email = ?"
CreateUser = "INSERT INTO users (id, name, email, picture, permissions) VALUES (? , ?, ?, ? , ?)"
SetNameUser = "UPDATE users SET name = ? WHERE id = ?"
SetPermissionsUser = "UPDATE users SET permissions = ? WHERE id = ?"
)

View file

@ -0,0 +1,112 @@
package user
import (
"context"
"github.com/google/uuid"
"github.com/jmoiron/sqlx"
"go.uber.org/zap"
"recipe-manager/config"
"recipe-manager/enums/permissions"
"recipe-manager/models"
"recipe-manager/services/logger"
"recipe-manager/services/user/queries"
)
type UserService interface {
CreateNewUser(ctx context.Context, name, email, picture string, permissions permissions.Permission) error
UpdateName(ctx context.Context, userID, name string) error
UpdatePermissions(ctx context.Context, userID string, permissions permissions.Permission) error
GetUserByID(ctx context.Context, userID string) (*models.User, error)
GetUserByEmail(ctx context.Context, email string) (*models.User, error)
}
type userService struct {
cft *config.ServerConfig
db *sqlx.DB
taoLogger *logger.TaoLogger
}
func (u *userService) CreateNewUser(ctx context.Context, name, email, picture string, permissions permissions.Permission) error {
user := ctx.Value("user").(*models.User)
u.taoLogger.Log.Info("User.CreateNewUser", zap.Reflect("user", map[string]interface{}{
"name": name,
"email": email,
"picture": picture,
"permissions": permissions,
}), zap.String("by", user.Email))
userID := uuid.New()
_, err := u.db.ExecContext(ctx, queries.CreateUser, userID, name, email, picture, permissions)
if err != nil {
u.taoLogger.Log.Error("User.CreateNewUser", zap.Error(err), zap.String("by", user.Email))
return err
}
return nil
}
func (u *userService) UpdateName(ctx context.Context, userID, name string) error {
user := ctx.Value("user").(*models.User)
u.taoLogger.Log.Info("User.UpdateName", zap.String("userID", userID), zap.String("name", name), zap.String("by", user.Email))
_, err := u.db.ExecContext(ctx, queries.SetNameUser, name, userID)
if err != nil {
u.taoLogger.Log.Error("User.UpdateName", zap.Error(err), zap.String("by", user.Email))
return err
}
return nil
}
func (u *userService) UpdatePermissions(ctx context.Context, userID string, perms permissions.Permission) error {
user := ctx.Value("user").(*models.User)
u.taoLogger.Log.Info("User.UpdatePermissions", zap.String("userID", userID), zap.Uint("permissions", uint(perms)), zap.String("by", user.Email))
_, err := u.db.ExecContext(ctx, queries.SetPermissionsUser, perms, userID)
if err != nil {
u.taoLogger.Log.Error("User.UpdatePermissions", zap.Error(err), zap.String("by", user.Email))
return err
}
return nil
}
func (u *userService) GetUserByID(ctx context.Context, userID string) (*models.User, error) {
userResult := &models.User{}
if err := u.db.GetContext(ctx, userResult, queries.GetUserByID, userID); err != nil {
u.taoLogger.Log.Error("User.GetUserByID", zap.Error(err))
return nil, err
}
return userResult, nil
}
func (u *userService) GetUserByEmail(ctx context.Context, email string) (*models.User, error) {
userResult := &models.User{}
if err := u.db.GetContext(ctx, userResult, queries.GetUserByEmail, email); err != nil {
u.taoLogger.Log.Error("User.GetUserByEmail", zap.Error(err))
return nil, err
}
return userResult, nil
}
func NewUserService(cfg *config.ServerConfig, db *sqlx.DB, taoLogger *logger.TaoLogger) UserService {
return &userService{cfg, db, taoLogger}
}