Using textsender-models now
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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{}
|
||||||
|
|||||||
@@ -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
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user