Spaces:
Sleeping
Sleeping
package services | |
import ( | |
"math/rand/v2" | |
"time" | |
"godp.abdanhafidz.com/config" | |
"godp.abdanhafidz.com/models" | |
"godp.abdanhafidz.com/repositories" | |
) | |
type EmailVerificationService struct { | |
Service[models.EmailVerification, models.EmailVerification] | |
} | |
func (s *EmailVerificationService) Create(email string) { | |
accountRepo := repositories.GetAccountbyEmail(email) | |
if accountRepo.NoRecord { | |
s.Error = accountRepo.RowsError | |
s.Exception.DataNotFound = true | |
s.Exception.Message = "There is no account data with given credentials!" | |
return | |
} | |
remainingTime := time.Duration(config.EMAIL_VERIFICATION_DURATION) * time.Hour | |
dueTime := CalculateDueTime(remainingTime) | |
token := uint(rand.IntN(999999-100000) + 100000) | |
repo := repositories.CreateEmailVerification(s.Constructor.Id, accountRepo.Result.Id, dueTime, token) | |
s.Error = repo.RowsError | |
s.Result = repo.Result | |
// // ⬇ Kirim token ke email user menggunakan SMTP | |
// go func(toEmail string, token uint) { | |
// from := config.SMTP_SENDER_EMAIL | |
// password := config.SMTP_SENDER_PASSWORD | |
// smtpHost := config.SMTP_HOST | |
// smtpPort := config.SMTP_PORT | |
// auth := smtp.PlainAuth("", from, password, smtpHost) | |
// subject := "Email Verification Token" | |
// body := fmt.Sprintf("Your verification token is: %06d\nPlease use it before it expires.", token) | |
// msg := []byte("To: " + toEmail + "\r\n" + | |
// "Subject: " + subject + "\r\n" + | |
// "\r\n" + | |
// body + "\r\n") | |
// err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, []string{toEmail}, msg) | |
// if err != nil { | |
// s.Error = err | |
// log.Printf("Error sending verification email: %v", err) | |
// return | |
// } | |
// }(accountRepo.Result.Email, token) | |
// s.Result.Token = repo.Result.Token | |
} | |
func (s *EmailVerificationService) Validate(email string) { | |
accountRepo := repositories.GetAccountbyEmail(email) | |
if accountRepo.NoRecord { | |
s.Error = accountRepo.RowsError | |
s.Exception.DataNotFound = true | |
s.Exception.Message = "There is no account data with given credentials!" | |
return | |
} | |
repo := repositories.GetEmailVerification(accountRepo.Result.Id, s.Constructor.Token) | |
s.Error = repo.RowsError | |
if repo.NoRecord { | |
s.Exception.DataNotFound = true | |
s.Exception.Message = "Invalid token!" | |
return | |
} | |
if repo.Result.ExpiredAt.Before(time.Now()) { | |
s.Exception.Unauthorized = true | |
s.Exception.Message = "Token has expired!" | |
repositories.UpdateExpiredEmailVerification(s.Constructor.Id) | |
s.Delete() | |
return | |
} | |
account := repositories.GetAccountById(repo.Result.AccountId) | |
account.Result.IsEmailVerified = true | |
repositories.UpdateAccount(account.Result) | |
s.Result = repo.Result | |
} | |
func (s *EmailVerificationService) Delete() { | |
repo := repositories.DeleteEmailVerification(s.Constructor.Token) | |
s.Error = repo.RowsError | |
if repo.NoRecord { | |
s.Exception.DataNotFound = true | |
s.Exception.Message = "Invalid token!" | |
return | |
} | |
s.Result = repo.Result | |
} | |