Swag Docs
This commit is contained in:
@ -2,9 +2,8 @@ package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"studioj/boilerplate_go/internal/models"
|
||||
"studioj/boilerplate_go/internal/repositories"
|
||||
"time"
|
||||
"learnsteam/learsteam-quiz-api/internal/models"
|
||||
"learnsteam/learsteam-quiz-api/internal/repositories"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
@ -18,7 +17,6 @@ type authService struct {
|
||||
type AuthService interface {
|
||||
Register(*models.RegisterRequest) (*models.User, error)
|
||||
Login(*models.LoginRequest) (*models.User, error)
|
||||
CreateToken(string) (*models.Token, error)
|
||||
}
|
||||
|
||||
func NewAuthService(userRepository repositories.UserRepository, tokenRepository repositories.TokenRepository) AuthService {
|
||||
@ -38,6 +36,8 @@ func (s *authService) Register(request *models.RegisterRequest) (*models.User, e
|
||||
newUser := models.User{
|
||||
ID: uuid.NewString(),
|
||||
Username: request.Username,
|
||||
Name: request.Name,
|
||||
Score: 0,
|
||||
Password: string(hash),
|
||||
}
|
||||
|
||||
@ -61,30 +61,3 @@ func (s *authService) Login(request *models.LoginRequest) (*models.User, error)
|
||||
}
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (s *authService) CreateToken(user_id string) (*models.Token, error) {
|
||||
tokenExpiredAt := time.Now().Add(time.Hour * 24 * 30)
|
||||
accessToken, err := s.tokenRepository.Generate(user_id, tokenExpiredAt.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
refreshExpiredAt := time.Now().Add(time.Hour * 24 * 90)
|
||||
refreshToken, err := s.tokenRepository.Generate(user_id, refreshExpiredAt.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newToken := &models.Token{
|
||||
ID: uuid.NewString(),
|
||||
UserID: user_id,
|
||||
Token: accessToken,
|
||||
RefreshToken: refreshToken,
|
||||
Status: "valid",
|
||||
ExpireAt: tokenExpiredAt,
|
||||
}
|
||||
|
||||
token, err := s.tokenRepository.Create(newToken)
|
||||
|
||||
return token, err
|
||||
}
|
||||
|
56
internal/services/program.go
Normal file
56
internal/services/program.go
Normal file
@ -0,0 +1,56 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/learsteam-quiz-api/internal/models"
|
||||
"learnsteam/learsteam-quiz-api/internal/repositories"
|
||||
)
|
||||
|
||||
type programService struct {
|
||||
repository repositories.ProgramRepository
|
||||
}
|
||||
|
||||
type ProgramService interface {
|
||||
List(string, string, int, int) (*[]models.Program, error)
|
||||
Total(string, string) (int64, error)
|
||||
|
||||
Find(string) (*models.Program, error)
|
||||
Create(*models.Program) (*models.Program, error)
|
||||
Update(*models.Program) (*models.Program, error)
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
func NewProgramService(repository repositories.ProgramRepository) ProgramService {
|
||||
return &programService{
|
||||
repository: repository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *programService) List(q string, tag string, page int, limit int) (*[]models.Program, error) {
|
||||
return s.repository.List(q, tag, page, limit)
|
||||
}
|
||||
|
||||
func (s *programService) Total(q string, tag string) (int64, error) {
|
||||
return s.repository.Total(q, tag)
|
||||
}
|
||||
|
||||
func (s *programService) Find(id string) (*models.Program, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *programService) Create(program *models.Program) (*models.Program, error) {
|
||||
result, err := s.repository.Create(program)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *programService) Update(program *models.Program) (*models.Program, error) {
|
||||
result, err := s.repository.Update(program)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *programService) Delete(id string) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
56
internal/services/quiz.go
Normal file
56
internal/services/quiz.go
Normal file
@ -0,0 +1,56 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/learsteam-quiz-api/internal/models"
|
||||
"learnsteam/learsteam-quiz-api/internal/repositories"
|
||||
)
|
||||
|
||||
type quizService struct {
|
||||
repository repositories.QuizRepository
|
||||
}
|
||||
|
||||
type QuizService interface {
|
||||
List(string, int, int) (*[]models.Quiz, error)
|
||||
Total(string) (int64, error)
|
||||
|
||||
Find(string) (*models.Quiz, error)
|
||||
Create(*models.Quiz) (*models.Quiz, error)
|
||||
Update(*models.Quiz) (*models.Quiz, error)
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
func NewQuizService(repository repositories.QuizRepository) QuizService {
|
||||
return &quizService{
|
||||
repository: repository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *quizService) List(program_id string, page int, limit int) (*[]models.Quiz, error) {
|
||||
return s.repository.List(program_id, page, limit)
|
||||
}
|
||||
|
||||
func (s *quizService) Total(tag string) (int64, error) {
|
||||
return s.repository.Total(tag)
|
||||
}
|
||||
|
||||
func (s *quizService) Find(id string) (*models.Quiz, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *quizService) Create(quiz *models.Quiz) (*models.Quiz, error) {
|
||||
result, err := s.repository.Create(quiz)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *quizService) Update(quiz *models.Quiz) (*models.Quiz, error) {
|
||||
result, err := s.repository.Update(quiz)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *quizService) Delete(id string) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
@ -1,14 +1,17 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
config "studioj/boilerplate_go/configs"
|
||||
"studioj/boilerplate_go/internal/models"
|
||||
"studioj/boilerplate_go/internal/repositories"
|
||||
config "learnsteam/learsteam-quiz-api/configs"
|
||||
"learnsteam/learsteam-quiz-api/internal/models"
|
||||
"learnsteam/learsteam-quiz-api/internal/repositories"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type tokenService struct {
|
||||
@ -17,10 +20,12 @@ type tokenService struct {
|
||||
|
||||
type TokenService interface {
|
||||
Find(string) (*models.Token, error)
|
||||
Create(*models.Token) (*models.Token, error)
|
||||
Create(string) (*models.Token, error)
|
||||
Update(*models.Token) (*models.Token, error)
|
||||
Delete(string) error
|
||||
|
||||
Refresh(string) (*models.Token, error)
|
||||
|
||||
Generate(string, int64) (string, error)
|
||||
Verify(tokenString string) (*jwt.Token, error)
|
||||
|
||||
@ -40,8 +45,31 @@ func (s *tokenService) Find(id string) (*models.Token, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *tokenService) Create(token *models.Token) (*models.Token, error) {
|
||||
return s.repository.Create(token)
|
||||
func (s *tokenService) Create(sub string) (*models.Token, error) {
|
||||
expiredAt := time.Now().Add(time.Hour * 24 * 30)
|
||||
accessToken, err := s.repository.Generate(sub, expiredAt.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
refreshExpiredAt := time.Now().Add(time.Hour * 24 * 90)
|
||||
refreshToken, err := s.repository.Generate(sub, refreshExpiredAt.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newToken := &models.Token{
|
||||
ID: uuid.NewString(),
|
||||
UserID: sub,
|
||||
Token: accessToken,
|
||||
RefreshToken: refreshToken,
|
||||
Expires: expiredAt.Unix(),
|
||||
RefreshExpires: refreshExpiredAt.Unix(),
|
||||
}
|
||||
|
||||
token, err := s.repository.Create(newToken)
|
||||
|
||||
return token, err
|
||||
}
|
||||
|
||||
func (s *tokenService) Update(token *models.Token) (*models.Token, error) {
|
||||
@ -113,3 +141,60 @@ func (s *tokenService) ValidToken(jwtToken *jwt.Token) (bool, error) {
|
||||
}
|
||||
return jwtToken.Valid, nil
|
||||
}
|
||||
|
||||
func (s *tokenService) Refresh(refreshToken string) (*models.Token, error) {
|
||||
fmt.Println("refresh_token", refreshToken)
|
||||
|
||||
jwtToken, err := jwt.Parse(refreshToken, func(jwtToken *jwt.Token) (interface{}, error) {
|
||||
if _, ok := jwtToken.Method.(*jwt.SigningMethodHMAC); !ok {
|
||||
return nil, fmt.Errorf("unexpected signing method: %v", jwtToken.Header["alg"])
|
||||
}
|
||||
return []byte(config.SECRET_KEY), nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("refresh token is not valid")
|
||||
} else {
|
||||
|
||||
fmt.Println("refresh token is valid")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("error", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
claims, ok := jwtToken.Claims.(jwt.MapClaims)
|
||||
if !ok || !jwtToken.Valid {
|
||||
return nil, errors.New("refresh token is invalid")
|
||||
}
|
||||
|
||||
sub := fmt.Sprintf("%s", claims["sub"])
|
||||
if err != nil {
|
||||
return nil, errors.New("wrong user")
|
||||
}
|
||||
|
||||
token, err := s.repository.FindByRefreshToken(sub, refreshToken)
|
||||
if err != nil {
|
||||
return nil, errors.New("wrong token")
|
||||
}
|
||||
|
||||
expiredAt := time.Now().Add(time.Hour * 24 * 30)
|
||||
accessToken, err := s.repository.Generate(sub, expiredAt.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
refreshExpiredAt := time.Now().Add(time.Hour * 24 * 90)
|
||||
refreshToken, err = s.repository.Generate(sub, refreshExpiredAt.Unix())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
token.Token = accessToken
|
||||
token.Expires = expiredAt.Unix()
|
||||
token.RefreshToken = refreshToken
|
||||
token.RefreshExpires = refreshExpiredAt.Unix()
|
||||
|
||||
return s.repository.Update(token)
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"studioj/boilerplate_go/internal/models"
|
||||
"studioj/boilerplate_go/internal/repositories"
|
||||
"learnsteam/learsteam-quiz-api/internal/models"
|
||||
"learnsteam/learsteam-quiz-api/internal/repositories"
|
||||
)
|
||||
|
||||
type userService struct {
|
||||
@ -11,7 +11,9 @@ type userService struct {
|
||||
}
|
||||
|
||||
type UserService interface {
|
||||
FindByID(string) (*models.User, error)
|
||||
List(string, int, int) (*[]models.User, error)
|
||||
Total(string) (int64, error)
|
||||
Find(string) (*models.User, error)
|
||||
FindByUsername(string) (*models.User, error)
|
||||
Create(*models.User) (*models.User, error)
|
||||
}
|
||||
@ -23,8 +25,16 @@ func NewUserService(repository repositories.UserRepository, tokenRepository repo
|
||||
}
|
||||
}
|
||||
|
||||
func (s *userService) FindByID(id string) (*models.User, error) {
|
||||
return s.repository.FindByID(id)
|
||||
func (s *userService) List(q string, page int, limit int) (*[]models.User, error) {
|
||||
return s.repository.List(q, page, limit)
|
||||
}
|
||||
|
||||
func (s *userService) Total(q string) (int64, error) {
|
||||
return s.repository.Total(q)
|
||||
}
|
||||
|
||||
func (s *userService) Find(id string) (*models.User, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *userService) FindByUsername(username string) (*models.User, error) {
|
||||
|
Reference in New Issue
Block a user