Swag Docs

This commit is contained in:
2023-11-17 01:38:01 +09:00
parent 0c3d31c129
commit 5b5870f354
49 changed files with 5004 additions and 193 deletions

View File

@ -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
}

View 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
View 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
}

View File

@ -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)
}

View File

@ -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) {