first commit
This commit is contained in:
72
internal/services/auth.go
Normal file
72
internal/services/auth.go
Normal file
@ -0,0 +1,72 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
type authService struct {
|
||||
userRepository repositories.UserRepository
|
||||
tokenRepository repositories.TokenRepository
|
||||
}
|
||||
|
||||
type AuthService interface {
|
||||
Register(*models.RegisterRequest) (*models.User, error)
|
||||
Login(*models.LoginRequest) (*models.User, error)
|
||||
}
|
||||
|
||||
func NewAuthService(userRepository repositories.UserRepository, tokenRepository repositories.TokenRepository) AuthService {
|
||||
return &authService{
|
||||
userRepository: userRepository,
|
||||
tokenRepository: tokenRepository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *authService) Register(request *models.RegisterRequest) (*models.User, error) {
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(request.Password), 10)
|
||||
if err != nil {
|
||||
return nil, errors.New("fail to hash password")
|
||||
}
|
||||
|
||||
// Create the user
|
||||
newUser := models.User{
|
||||
GUID: uuid.NewString(),
|
||||
FirstName: request.FirstName,
|
||||
LastName: request.LastName,
|
||||
Username: request.Username,
|
||||
Password: string(hash),
|
||||
Gender: request.Gender,
|
||||
Phone: request.Phone,
|
||||
UserRole: request.UserRole,
|
||||
Image: request.Image,
|
||||
RegisterAt: time.Now(),
|
||||
}
|
||||
|
||||
fmt.Println(newUser)
|
||||
|
||||
user, err := s.userRepository.Create(&newUser)
|
||||
if err != nil {
|
||||
return nil, errors.New("fail to create user")
|
||||
}
|
||||
|
||||
return user, err
|
||||
}
|
||||
|
||||
func (s *authService) Login(request *models.LoginRequest) (*models.User, error) {
|
||||
user, err := s.userRepository.FindByUsername(request.Username)
|
||||
if err != nil || user == nil {
|
||||
return nil, errors.New("invalid user or password")
|
||||
}
|
||||
|
||||
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(request.Password))
|
||||
if err != nil {
|
||||
return nil, errors.New("invalid user or password")
|
||||
}
|
||||
return user, nil
|
||||
}
|
64
internal/services/center.go
Normal file
64
internal/services/center.go
Normal file
@ -0,0 +1,64 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
)
|
||||
|
||||
type centerService struct {
|
||||
repository repositories.CenterRepository
|
||||
tokenRepository repositories.TokenRepository
|
||||
}
|
||||
|
||||
type CenterService interface {
|
||||
List(string, int, int) (*[]models.Center, error)
|
||||
Total(string) (int64, error)
|
||||
|
||||
Find(int64) (*models.Center, error)
|
||||
FindByTitle(string) (*models.Center, error)
|
||||
|
||||
Create(*models.Center) (*models.Center, error)
|
||||
Update(*models.Center) (*models.Center, error)
|
||||
Delete(int64) error
|
||||
}
|
||||
|
||||
func NewCenterService(repository repositories.CenterRepository, tokenRepository repositories.TokenRepository) CenterService {
|
||||
return ¢erService{
|
||||
repository: repository,
|
||||
tokenRepository: tokenRepository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *centerService) List(q string, page int, limit int) (*[]models.Center, error) {
|
||||
return s.repository.List(q, page, limit)
|
||||
}
|
||||
|
||||
func (s *centerService) Total(q string) (int64, error) {
|
||||
return s.repository.Total(q)
|
||||
}
|
||||
|
||||
func (s *centerService) Find(id int64) (*models.Center, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *centerService) FindByTitle(centername string) (*models.Center, error) {
|
||||
return s.repository.FindByTitle(centername)
|
||||
}
|
||||
|
||||
func (s *centerService) Create(center *models.Center) (*models.Center, error) {
|
||||
result, err := s.repository.Create(center)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *centerService) Update(center *models.Center) (*models.Center, error) {
|
||||
result, err := s.repository.Update(center)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *centerService) Delete(id int64) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
85
internal/services/quiz.go
Normal file
85
internal/services/quiz.go
Normal file
@ -0,0 +1,85 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type quizService struct {
|
||||
repository repositories.QuizRepository
|
||||
}
|
||||
|
||||
type QuizService interface {
|
||||
List(int64, int, int) (*[]models.Quiz, error)
|
||||
Total(int64) (int64, error)
|
||||
|
||||
Find(int64) (*models.Quiz, error)
|
||||
Create(*models.Quiz) (*models.Quiz, error)
|
||||
Update(*models.Quiz) (*models.Quiz, error)
|
||||
Delete(int64) error
|
||||
}
|
||||
|
||||
func NewQuizService(repository repositories.QuizRepository) QuizService {
|
||||
return &quizService{
|
||||
repository: repository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *quizService) List(quiz_paper_id int64, page int, limit int) (*[]models.Quiz, error) {
|
||||
return s.repository.List(quiz_paper_id, page, limit)
|
||||
}
|
||||
|
||||
func (s *quizService) Total(quiz_paper_id int64) (int64, error) {
|
||||
return s.repository.Total(quiz_paper_id)
|
||||
}
|
||||
|
||||
func (s *quizService) Find(id int64) (*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 int64) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *quizService) Generate(quizpaper *models.QuizPaper) ([]models.Quiz, error) {
|
||||
templates, err := s.repository.List(quizpaper.ID, 1, 1000)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var quizzes []models.Quiz
|
||||
for _, q := range *templates {
|
||||
quiz := models.Quiz{
|
||||
GUID: uuid.NewString(),
|
||||
CenterID: quizpaper.CenterID,
|
||||
QuizPaperID: quizpaper.ID,
|
||||
No: q.No,
|
||||
QuestionType: q.QuestionType,
|
||||
Question: q.Question,
|
||||
Content: q.Content,
|
||||
Answer: q.Answer,
|
||||
UpdatedAt: time.Now(),
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
quizzes = append(quizzes, quiz)
|
||||
}
|
||||
|
||||
return quizzes, nil
|
||||
}
|
56
internal/services/quizpaper.go
Normal file
56
internal/services/quizpaper.go
Normal file
@ -0,0 +1,56 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
)
|
||||
|
||||
type quizPaperService struct {
|
||||
repository repositories.QuizPaperRepository
|
||||
}
|
||||
|
||||
type QuizPaperService interface {
|
||||
List(string, string, int, int) (*[]models.QuizPaper, error)
|
||||
Total(string, string) (int64, error)
|
||||
|
||||
Find(int64) (*models.QuizPaper, error)
|
||||
Create(*models.QuizPaper) (*models.QuizPaper, error)
|
||||
Update(*models.QuizPaper) (*models.QuizPaper, error)
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
func NewQuizPaperService(repository repositories.QuizPaperRepository) QuizPaperService {
|
||||
return &quizPaperService{
|
||||
repository: repository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *quizPaperService) List(q string, tag string, page int, limit int) (*[]models.QuizPaper, error) {
|
||||
return s.repository.List(q, tag, page, limit)
|
||||
}
|
||||
|
||||
func (s *quizPaperService) Total(q string, tag string) (int64, error) {
|
||||
return s.repository.Total(q, tag)
|
||||
}
|
||||
|
||||
func (s *quizPaperService) Find(id int64) (*models.QuizPaper, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *quizPaperService) Create(quizPaper *models.QuizPaper) (*models.QuizPaper, error) {
|
||||
result, err := s.repository.Create(quizPaper)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *quizPaperService) Update(quizPaper *models.QuizPaper) (*models.QuizPaper, error) {
|
||||
result, err := s.repository.Update(quizPaper)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *quizPaperService) Delete(id string) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
200
internal/services/token.go
Normal file
200
internal/services/token.go
Normal file
@ -0,0 +1,200 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
config "learnsteam/cslms-api/configs"
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
|
||||
"github.com/golang-jwt/jwt/v5"
|
||||
)
|
||||
|
||||
type tokenService struct {
|
||||
repository repositories.TokenRepository
|
||||
}
|
||||
|
||||
type TokenService interface {
|
||||
Find(int64) (*models.Token, error)
|
||||
Create(int64, string) (*models.Token, error)
|
||||
Update(*models.Token) (*models.Token, error)
|
||||
Delete(string) error
|
||||
|
||||
Refresh(string) (*models.Token, error)
|
||||
|
||||
Generate(string, int64, string) (string, error)
|
||||
Verify(tokenString string) (*jwt.Token, error)
|
||||
|
||||
GetJwtToken(string) (*jwt.Token, error)
|
||||
ExtractTokenString(string) string
|
||||
VerifyTokenString(string) (*jwt.Token, error)
|
||||
ValidToken(*jwt.Token) (bool, error)
|
||||
}
|
||||
|
||||
func NewTokenService(repository repositories.TokenRepository) TokenService {
|
||||
return &tokenService{
|
||||
repository: repository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *tokenService) Find(id int64) (*models.Token, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *tokenService) Create(user_id int64, role string) (*models.Token, error) {
|
||||
expiredAt := time.Now().Add(time.Hour * 24 * 30)
|
||||
accessToken, err := s.repository.Generate(user_id, expiredAt.Unix(), role)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
refreshExpiredAt := time.Now().Add(time.Hour * 24 * 90)
|
||||
refreshToken, err := s.repository.Generate(user_id, refreshExpiredAt.Unix(), role)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
newToken := &models.Token{
|
||||
UserID: user_id,
|
||||
Token: accessToken,
|
||||
RefreshToken: refreshToken,
|
||||
Status: "on",
|
||||
EndingAt: expiredAt,
|
||||
RegisterAt: time.Now(),
|
||||
}
|
||||
|
||||
token, err := s.repository.Create(newToken)
|
||||
|
||||
return token, err
|
||||
}
|
||||
|
||||
func (s *tokenService) Update(token *models.Token) (*models.Token, error) {
|
||||
return s.repository.Update(token)
|
||||
}
|
||||
|
||||
func (s *tokenService) Delete(id string) error {
|
||||
return s.repository.Delete(id)
|
||||
}
|
||||
|
||||
func (s *tokenService) Verify(tokenString string) (*jwt.Token, error) {
|
||||
jwtToken, err := jwt.Parse(tokenString, 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
|
||||
})
|
||||
|
||||
return jwtToken, err
|
||||
}
|
||||
|
||||
func (s *tokenService) Generate(user_id string, expire_at int64, role string) (string, error) {
|
||||
claims := jwt.MapClaims{}
|
||||
claims["authorized"] = true
|
||||
claims["sub"] = user_id
|
||||
claims["exp"] = expire_at
|
||||
claims["role"] = role
|
||||
at := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
||||
token, err := at.SignedString([]byte(config.SECRET_KEY))
|
||||
|
||||
return token, err
|
||||
}
|
||||
|
||||
func (s *tokenService) GetJwtToken(tokenString string) (*jwt.Token, error) {
|
||||
jwtToken, err := jwt.Parse(tokenString, 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
|
||||
})
|
||||
return jwtToken, err
|
||||
}
|
||||
|
||||
func (s *tokenService) ExtractTokenString(authorization string) string {
|
||||
strArr := strings.Split(authorization, " ")
|
||||
if len(strArr) == 2 {
|
||||
return strArr[1]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (s *tokenService) VerifyTokenString(tokenString string) (*jwt.Token, error) {
|
||||
jwtToken, err := jwt.Parse(tokenString, 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 {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return jwtToken, nil
|
||||
}
|
||||
|
||||
func (s *tokenService) ValidToken(jwtToken *jwt.Token) (bool, error) {
|
||||
if jwtToken == nil {
|
||||
return false, fmt.Errorf("no token")
|
||||
}
|
||||
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 := claims["sub"].(int64)
|
||||
if err != nil {
|
||||
return nil, errors.New("wrong user")
|
||||
}
|
||||
role := claims["role"].(string)
|
||||
|
||||
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(), role)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
refreshExpiredAt := time.Now().Add(time.Hour * 24 * 90)
|
||||
refreshToken, err = s.repository.Generate(sub, refreshExpiredAt.Unix(), role)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
token.Token = accessToken
|
||||
token.EndingAt = expiredAt
|
||||
token.RefreshToken = refreshToken
|
||||
|
||||
return s.repository.Update(token)
|
||||
}
|
48
internal/services/user.go
Normal file
48
internal/services/user.go
Normal file
@ -0,0 +1,48 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
)
|
||||
|
||||
type userService struct {
|
||||
repository repositories.UserRepository
|
||||
tokenRepository repositories.TokenRepository
|
||||
}
|
||||
|
||||
type UserService interface {
|
||||
List(string, int, int) (*[]models.User, error)
|
||||
Total(string) (int64, error)
|
||||
Find(int64) (*models.User, error)
|
||||
FindByUsername(string) (*models.User, error)
|
||||
Create(*models.User) (*models.User, error)
|
||||
}
|
||||
|
||||
func NewUserService(repository repositories.UserRepository, tokenRepository repositories.TokenRepository) UserService {
|
||||
return &userService{
|
||||
repository: repository,
|
||||
tokenRepository: tokenRepository,
|
||||
}
|
||||
}
|
||||
|
||||
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 int64) (*models.User, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *userService) FindByUsername(username string) (*models.User, error) {
|
||||
return s.repository.FindByUsername(username)
|
||||
}
|
||||
|
||||
func (s *userService) Create(user *models.User) (*models.User, error) {
|
||||
result, err := s.repository.Create(user)
|
||||
|
||||
return result, err
|
||||
}
|
94
internal/services/userquiz.go
Normal file
94
internal/services/userquiz.go
Normal file
@ -0,0 +1,94 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
)
|
||||
|
||||
type userQuizService struct {
|
||||
repository repositories.UserQuizRepository
|
||||
quizRepository repositories.QuizRepository
|
||||
}
|
||||
|
||||
type UserQuizService interface {
|
||||
List(int64, int, int) (*[]models.UserQuiz, error)
|
||||
Total(int64) (int64, error)
|
||||
|
||||
Find(int64) (*models.UserQuiz, error)
|
||||
Create(*models.UserQuiz) (*models.UserQuiz, error)
|
||||
Insert([]models.UserQuiz) ([]models.UserQuiz, error)
|
||||
Update(*models.UserQuiz) (*models.UserQuiz, error)
|
||||
Delete(int64) error
|
||||
Generate(int64, *models.UserQuizPaper) ([]models.UserQuiz, error)
|
||||
}
|
||||
|
||||
func NewUserQuizService(repository repositories.UserQuizRepository, quizRepository repositories.QuizRepository) UserQuizService {
|
||||
return &userQuizService{
|
||||
repository: repository,
|
||||
quizRepository: quizRepository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *userQuizService) List(user_quiz_paper_id int64, page int, limit int) (*[]models.UserQuiz, error) {
|
||||
return s.repository.List(user_quiz_paper_id, page, limit)
|
||||
}
|
||||
|
||||
func (s *userQuizService) Total(user_quiz_paper_id int64) (int64, error) {
|
||||
return s.repository.Total(user_quiz_paper_id)
|
||||
}
|
||||
|
||||
func (s *userQuizService) Find(id int64) (*models.UserQuiz, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *userQuizService) Create(quiz *models.UserQuiz) (*models.UserQuiz, error) {
|
||||
result, err := s.repository.Create(quiz)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *userQuizService) Insert(items []models.UserQuiz) ([]models.UserQuiz, error) {
|
||||
result, err := s.repository.Insert(items)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *userQuizService) Update(quiz *models.UserQuiz) (*models.UserQuiz, error) {
|
||||
result, err := s.repository.Update(quiz)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *userQuizService) Delete(id int64) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *userQuizService) Generate(quiz_paper_id int64, userQuizPaper *models.UserQuizPaper) ([]models.UserQuiz, error) {
|
||||
var userQuizzes []models.UserQuiz
|
||||
quizzes, err := s.quizRepository.List(quiz_paper_id, 1, 1000)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for _, quiz := range *quizzes {
|
||||
userQuiz := models.UserQuiz{
|
||||
GUID: quiz.GUID,
|
||||
CenterID: quiz.CenterID,
|
||||
UserQuizPaperID: userQuizPaper.ID,
|
||||
UserID: userQuizPaper.UserID,
|
||||
No: quiz.No,
|
||||
QuestionType: quiz.QuestionType,
|
||||
Question: quiz.Question,
|
||||
Content: quiz.Content,
|
||||
}
|
||||
|
||||
fmt.Println(userQuiz.Content)
|
||||
// fmt.Println(userQuiz.Answer)
|
||||
userQuizzes = append(userQuizzes, userQuiz)
|
||||
}
|
||||
|
||||
return userQuizzes, nil
|
||||
}
|
83
internal/services/userquizpaper.go
Normal file
83
internal/services/userquizpaper.go
Normal file
@ -0,0 +1,83 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"learnsteam/cslms-api/internal/models"
|
||||
"learnsteam/cslms-api/internal/repositories"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type userQuizPaperService struct {
|
||||
repository repositories.UserQuizPaperRepository
|
||||
}
|
||||
|
||||
type UserQuizPaperService interface {
|
||||
List(string, int, int) (*[]models.UserQuizPaper, error)
|
||||
Total(string) (int64, error)
|
||||
|
||||
Find(int64) (*models.UserQuizPaper, error)
|
||||
Create(*models.UserQuizPaper) (*models.UserQuizPaper, error)
|
||||
Insert([]models.UserQuizPaper) ([]models.UserQuizPaper, error)
|
||||
Update(*models.UserQuizPaper) (*models.UserQuizPaper, error)
|
||||
Delete(string) error
|
||||
Generate([]int64, *models.QuizPaper) []models.UserQuizPaper
|
||||
}
|
||||
|
||||
func NewUserQuizPaperService(repository repositories.UserQuizPaperRepository) UserQuizPaperService {
|
||||
return &userQuizPaperService{
|
||||
repository: repository,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) List(q string, page int, limit int) (*[]models.UserQuizPaper, error) {
|
||||
return s.repository.List(q, page, limit)
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Total(q string) (int64, error) {
|
||||
return s.repository.Total(q)
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Find(id int64) (*models.UserQuizPaper, error) {
|
||||
return s.repository.Find(id)
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Create(userQuizPaper *models.UserQuizPaper) (*models.UserQuizPaper, error) {
|
||||
result, err := s.repository.Create(userQuizPaper)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Insert(items []models.UserQuizPaper) ([]models.UserQuizPaper, error) {
|
||||
result, err := s.repository.Insert(items)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Update(userQuizPaper *models.UserQuizPaper) (*models.UserQuizPaper, error) {
|
||||
result, err := s.repository.Update(userQuizPaper)
|
||||
|
||||
return result, err
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Delete(id string) error {
|
||||
err := s.repository.Delete(id)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *userQuizPaperService) Generate(users []int64, quizPaper *models.QuizPaper) []models.UserQuizPaper {
|
||||
var userQuizPapers []models.UserQuizPaper
|
||||
|
||||
for _, user_id := range users {
|
||||
userQuizPaper := models.UserQuizPaper{
|
||||
GUID: uuid.NewString(),
|
||||
CenterID: quizPaper.CenterID,
|
||||
UserID: user_id,
|
||||
QuizPaperID: quizPaper.ID,
|
||||
}
|
||||
|
||||
userQuizPapers = append(userQuizPapers, userQuizPaper)
|
||||
}
|
||||
|
||||
return userQuizPapers
|
||||
}
|
Reference in New Issue
Block a user