Using textsender-models now

This commit is contained in:
phoenix
2025-11-01 17:21:27 -04:00
parent 12f8b18524
commit 25c283434d
6 changed files with 43 additions and 37 deletions
+4 -3
View File
@@ -7,6 +7,7 @@ import (
"git.kundeng.us/phoenix/textsender-auth/internal/config" "git.kundeng.us/phoenix/textsender-auth/internal/config"
"git.kundeng.us/phoenix/textsender-auth/internal/model" "git.kundeng.us/phoenix/textsender-auth/internal/model"
"git.kundeng.us/phoenix/textsender-auth/internal/utility" "git.kundeng.us/phoenix/textsender-auth/internal/utility"
"git.kundeng.us/phoenix/textsender-models/pkg/token"
) )
type LoginAccount struct { type LoginAccount struct {
@@ -16,7 +17,7 @@ type LoginAccount struct {
type LoginResponse struct { type LoginResponse struct {
Message string `json:"message"` Message string `json:"message"`
Data []model.Login `json:"data"` Data []token.Login `json:"data"`
} }
type LoginHandler struct { type LoginHandler struct {
@@ -62,13 +63,13 @@ func (l *LoginHandler) Login(w http.ResponseWriter, r *http.Request) {
var tokGen utility.TokenGenerator var tokGen utility.TokenGenerator
secretKey := config.GetSecretKey() secretKey := config.GetSecretKey()
tokGen.SetSecretKey(secretKey) tokGen.SetSecretKey(secretKey)
if token, err := tokGen.GenerateToken(*user); err != nil { if myToken, err := tokGen.GenerateToken(*user); err != nil {
fmt.Println(err.Error()) fmt.Println(err.Error())
statusCode = http.StatusInternalServerError statusCode = http.StatusInternalServerError
resp.Message = "Error generating token" resp.Message = "Error generating token"
} else { } else {
statusCode = http.StatusOK statusCode = http.StatusOK
resp.Data = append(resp.Data, *token) resp.Data = append(resp.Data, *myToken)
resp.Message = "Successful" resp.Message = "Successful"
} }
} else { } else {
+10 -10
View File
@@ -7,24 +7,24 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
"git.kundeng.us/phoenix/textsender-auth/internal/model" "git.kundeng.us/phoenix/textsender-models/pkg/user"
) )
type MockUserStore struct { type MockUserStore struct {
Users map[uuid.UUID]*model.User Users map[uuid.UUID]*user.User
UsersByUsername map[string]*model.User UsersByUsername map[string]*user.User
mu sync.RWMutex mu sync.RWMutex
Error error // Optional: simulate errors Error error // Optional: simulate errors
} }
func NewMockUserStore() *MockUserStore { func NewMockUserStore() *MockUserStore {
return &MockUserStore{ return &MockUserStore{
Users: make(map[uuid.UUID]*model.User), Users: make(map[uuid.UUID]*user.User),
UsersByUsername: make(map[string]*model.User), UsersByUsername: make(map[string]*user.User),
} }
} }
func (m *MockUserStore) CreateUser(ctx context.Context, user *model.User) error { func (m *MockUserStore) CreateUser(ctx context.Context, user *user.User) error {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
@@ -45,7 +45,7 @@ func (m *MockUserStore) CreateUser(ctx context.Context, user *model.User) error
return nil return nil
} }
func (m *MockUserStore) GetUserByID(ctx context.Context, id uuid.UUID) (*model.User, error) { func (m *MockUserStore) GetUserByID(ctx context.Context, id uuid.UUID) (*user.User, error) {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
@@ -65,7 +65,7 @@ func (m *MockUserStore) GetUserByID(ctx context.Context, id uuid.UUID) (*model.U
return user, nil return user, nil
} }
func (m *MockUserStore) GetUserByUsername(ctx context.Context, username string) (*model.User, error) { func (m *MockUserStore) GetUserByUsername(ctx context.Context, username string) (*user.User, error) {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
@@ -81,7 +81,7 @@ func (m *MockUserStore) GetUserByUsername(ctx context.Context, username string)
return user, nil return user, nil
} }
func (m *MockUserStore) GetAllUsers(ctx context.Context) ([]*model.User, error) { func (m *MockUserStore) GetAllUsers(ctx context.Context) ([]*user.User, error) {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
@@ -89,7 +89,7 @@ func (m *MockUserStore) GetAllUsers(ctx context.Context) ([]*model.User, error)
return nil, m.Error return nil, m.Error
} }
users := make([]*model.User, 0, len(m.Users)) users := make([]*user.User, 0, len(m.Users))
for _, user := range m.Users { for _, user := range m.Users {
users = append(users, user) users = append(users, user)
} }
+2 -1
View File
@@ -7,6 +7,7 @@ import (
"git.kundeng.us/phoenix/textsender-auth/internal/model" "git.kundeng.us/phoenix/textsender-auth/internal/model"
"git.kundeng.us/phoenix/textsender-auth/internal/utility" "git.kundeng.us/phoenix/textsender-auth/internal/utility"
"git.kundeng.us/phoenix/textsender-models/pkg/user"
) )
type RegisterUser struct { type RegisterUser struct {
@@ -49,7 +50,7 @@ func (h *UserHandler) Register(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close() defer r.Body.Close()
user := model.User{Username: req.Username, Password: req.Password, PhoneNumber: req.PhoneNumber} user := user.User{Username: req.Username, Password: req.Password, PhoneNumber: req.PhoneNumber}
var statusCode int var statusCode int
resp := RegisterResponse{} resp := RegisterResponse{}
+3 -3
View File
@@ -1,9 +1,9 @@
package handler package handler
import ( import (
"git.kundeng.us/phoenix/textsender-auth/internal/model" "git.kundeng.us/phoenix/textsender-models/pkg/user"
) )
func GetTestUser() model.User { func GetTestUser() user.User {
return model.User{Username: "ghost", PhoneNumber: "+1234567890", Password: "dfgdffddfd"} return user.User{Username: "ghost", PhoneNumber: "+1234567890", Password: "dfgdffddfd"}
} }
+16 -12
View File
@@ -7,20 +7,24 @@ import (
"github.com/google/uuid" "github.com/google/uuid"
"github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgxpool" "github.com/jackc/pgx/v5/pgxpool"
"git.kundeng.us/phoenix/textsender-models/pkg/user"
) )
/*
type User struct { type User struct {
Id uuid.UUID `json:"id"` Id uuid.UUID `json:"id"`
PhoneNumber string `json:"phone_number"` PhoneNumber string `json:"phone_number"`
Username string `json:"username"` Username string `json:"username"`
Password string `json:"password"` Password string `json:"password"`
} }
*/
type UserStore interface { type UserStore interface {
CreateUser(ctx context.Context, user *User) error CreateUser(ctx context.Context, user *user.User) error
GetUserByID(ctx context.Context, id uuid.UUID) (*User, error) GetUserByID(ctx context.Context, id uuid.UUID) (*user.User, error)
GetUserByUsername(ctx context.Context, username string) (*User, error) GetUserByUsername(ctx context.Context, username string) (*user.User, error)
GetAllUsers(ctx context.Context) ([]*User, error) GetAllUsers(ctx context.Context) ([]*user.User, error)
UserExists(ctx context.Context, username string) (bool, error) UserExists(ctx context.Context, username string) (bool, error)
} }
@@ -32,7 +36,7 @@ func NewUserStore(db *pgxpool.Pool) *PGUserStore {
return &PGUserStore{db: db} return &PGUserStore{db: db}
} }
func (s *PGUserStore) CreateUser(ctx context.Context, user *User) error { func (s *PGUserStore) CreateUser(ctx context.Context, user *user.User) error {
query := ` query := `
INSERT INTO users (phone_number, username, password) INSERT INTO users (phone_number, username, password)
VALUES ($1, $2, $3) VALUES ($1, $2, $3)
@@ -44,10 +48,10 @@ func (s *PGUserStore) CreateUser(ctx context.Context, user *User) error {
) )
} }
func (s *PGUserStore) GetUserByID(ctx context.Context, id uuid.UUID) (*User, error) { func (s *PGUserStore) GetUserByID(ctx context.Context, id uuid.UUID) (*user.User, error) {
query := `SELECT id, username, password, phone_number FROM users WHERE id = $1` query := `SELECT id, username, password, phone_number FROM users WHERE id = $1`
var user User var user user.User
err := s.db.QueryRow(ctx, query, id).Scan( err := s.db.QueryRow(ctx, query, id).Scan(
&user.Id, &user.Username, &user.Password, &user.PhoneNumber, &user.Id, &user.Username, &user.Password, &user.PhoneNumber,
) )
@@ -62,10 +66,10 @@ func (s *PGUserStore) GetUserByID(ctx context.Context, id uuid.UUID) (*User, err
return &user, nil return &user, nil
} }
func (s *PGUserStore) GetUserByUsername(ctx context.Context, username string) (*User, error) { func (s *PGUserStore) GetUserByUsername(ctx context.Context, username string) (*user.User, error) {
query := `SELECT id, username, password, phone_number FROM users WHERE username = $1` query := `SELECT id, username, password, phone_number FROM users WHERE username = $1`
var user User var user user.User
err := s.db.QueryRow(ctx, query, username).Scan( err := s.db.QueryRow(ctx, query, username).Scan(
&user.Id, &user.Username, &user.Password, &user.PhoneNumber, &user.Id, &user.Username, &user.Password, &user.PhoneNumber,
) )
@@ -80,7 +84,7 @@ func (s *PGUserStore) GetUserByUsername(ctx context.Context, username string) (*
return &user, nil return &user, nil
} }
func (s *PGUserStore) GetAllUsers(ctx context.Context) ([]*User, error) { func (s *PGUserStore) GetAllUsers(ctx context.Context) ([]*user.User, error) {
query := `SELECT id, username, password, phone_number FROM users` query := `SELECT id, username, password, phone_number FROM users`
rows, err := s.db.Query(ctx, query) rows, err := s.db.Query(ctx, query)
@@ -89,9 +93,9 @@ func (s *PGUserStore) GetAllUsers(ctx context.Context) ([]*User, error) {
} }
defer rows.Close() defer rows.Close()
var users []*User var users []*user.User
for rows.Next() { for rows.Next() {
var user User var user user.User
if err := rows.Scan( if err := rows.Scan(
&user.Id, &user.Username, &user.Password, &user.PhoneNumber, &user.Id, &user.Username, &user.Password, &user.PhoneNumber,
); err != nil { ); err != nil {
+8 -8
View File
@@ -4,11 +4,11 @@ import (
"time" "time"
"github.com/golang-jwt/jwt/v5" "github.com/golang-jwt/jwt/v5"
"github.com/google/uuid" // "github.com/google/uuid"
"git.kundeng.us/phoenix/textsender-auth/internal/config" "git.kundeng.us/phoenix/textsender-auth/internal/config"
intmodels "git.kundeng.us/phoenix/textsender-auth/internal/model"
"git.kundeng.us/phoenix/textsender-models/pkg/token" "git.kundeng.us/phoenix/textsender-models/pkg/token"
"git.kundeng.us/phoenix/textsender-models/pkg/user"
) )
const ROLE_TYPE = "regular" const ROLE_TYPE = "regular"
@@ -22,23 +22,23 @@ func (t *TokenGenerator) SetSecretKey(secretKey string) {
t.SecretKey = []byte(secretKey) t.SecretKey = []byte(secretKey)
} }
func (t *TokenGenerator) GenerateToken(user intmodels.User) (*intmodels.Login, error) { func (t *TokenGenerator) GenerateToken(user user.User) (*token.Login, error) {
issuedAt := time.Now() issuedAt := time.Now()
expirationTime := time.Now().Add(4 * time.Hour) expirationTime := time.Now().Add(4 * time.Hour)
claims := t.generateClaims(user, TOKEN_TYPE, issuedAt, expirationTime) claims := t.generateClaims(user, TOKEN_TYPE, issuedAt, expirationTime)
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) myToken := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
if tokenString, err := token.SignedString(t.SecretKey); err != nil { if tokenString, err := myToken.SignedString(t.SecretKey); err != nil {
return nil, err return nil, err
} else { } else {
return &intmodels.Login{AccessToken: tokenString, TokenType: TOKEN_TYPE, ExpiresIn: expirationTime.Unix()}, nil return &token.Login{AccessToken: tokenString, TokenType: TOKEN_TYPE, ExpiresIn: expirationTime.Unix()}, nil
} }
} }
func (t *TokenGenerator) generateClaims(user intmodels.User, role string, issuedAt time.Time, expiredAt time.Time) token.Claims { func (t *TokenGenerator) generateClaims(user user.User, role string, issuedAt time.Time, expiredAt time.Time) token.Claims {
return token.Claims{ return token.Claims{
// UserId: user.Id.String(), // UserId: user.Id.String(),
UserId: uuid.New(), UserId: user.Id,
Role: role, Role: role,
RegisteredClaims: jwt.RegisteredClaims{ RegisteredClaims: jwt.RegisteredClaims{
Issuer: config.App_Name, Issuer: config.App_Name,