- migration 0002: users.verified boolean, default false
- verified rides in the JWT (role + verified claims)
- POST /users/{id}/verify + /unverify, admin-only (403 otherwise)
- Issue now takes the whole user so trust claims travel in the token
- unit + integration + admin-flow tests
44 lines
1.0 KiB
Go
44 lines
1.0 KiB
Go
package http
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/emil28092005/SciMesh/users/internal/domain"
|
|
)
|
|
|
|
// registerRequest / loginRequest are the JSON bodies clients POST. Kept separate
|
|
// from the domain so the wire format can evolve without touching the entity.
|
|
type registerRequest struct {
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
type loginRequest struct {
|
|
Email string `json:"email"`
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
// userResponse is the public view of a user. It never carries the password hash.
|
|
type userResponse struct {
|
|
ID string `json:"id"`
|
|
Email string `json:"email"`
|
|
Role string `json:"role"`
|
|
Verified bool `json:"verified"`
|
|
CreatedAt string `json:"created_at"`
|
|
}
|
|
|
|
type loginResponse struct {
|
|
Token string `json:"token"`
|
|
User userResponse `json:"user"`
|
|
}
|
|
|
|
func toUserResponse(u *domain.User) userResponse {
|
|
return userResponse{
|
|
ID: u.ID.String(),
|
|
Email: u.Email,
|
|
Role: string(u.Role),
|
|
Verified: u.Verified,
|
|
CreatedAt: u.CreatedAt.UTC().Format(time.RFC3339),
|
|
}
|
|
}
|