97 lines
3.0 KiB
Go
Raw Normal View History

2024-01-29 00:32:39 +08:00
package services
import (
2024-03-16 15:40:27 +08:00
"fmt"
"strings"
"time"
"git.solsynth.dev/hypernet/passport/pkg/authkit/models"
"git.solsynth.dev/hypernet/passport/pkg/internal/gap"
2024-10-27 00:06:23 +08:00
"git.solsynth.dev/hypernet/pusher/pkg/pushkit"
2024-03-16 15:40:27 +08:00
"git.solsynth.dev/hypernet/passport/pkg/internal/database"
2024-01-29 00:32:39 +08:00
"github.com/google/uuid"
"github.com/spf13/viper"
)
2024-01-29 16:11:59 +08:00
func ValidateMagicToken(code string, mode models.MagicTokenType) (models.MagicToken, error) {
var tk models.MagicToken
if err := database.C.Where(models.MagicToken{Code: code, Type: mode}).First(&tk).Error; err != nil {
return tk, err
} else if tk.ExpiredAt != nil && time.Now().Unix() >= tk.ExpiredAt.Unix() {
return tk, fmt.Errorf("token has been expired")
}
return tk, nil
}
2024-01-29 00:32:39 +08:00
func NewMagicToken(mode models.MagicTokenType, assignTo *models.Account, expiredAt *time.Time) (models.MagicToken, error) {
var uid uint
if assignTo != nil {
uid = assignTo.ID
}
token := models.MagicToken{
Code: strings.Replace(uuid.NewString(), "-", "", -1),
Type: mode,
2024-06-26 15:52:58 +08:00
AccountID: &uid,
2024-01-29 00:32:39 +08:00
ExpiredAt: expiredAt,
}
if err := database.C.Save(&token).Error; err != nil {
return token, err
} else {
return token, nil
}
}
func NotifyMagicToken(token models.MagicToken) error {
2024-06-26 15:52:58 +08:00
if token.AccountID == nil {
2024-01-29 00:32:39 +08:00
return fmt.Errorf("could notify a non-assign magic token")
}
var user models.Account
2024-01-29 16:11:59 +08:00
if err := database.C.Where(&models.Account{
2024-06-26 15:52:58 +08:00
BaseModel: models.BaseModel{ID: *token.AccountID},
2024-01-29 00:32:39 +08:00
}).Preload("Contacts").First(&user).Error; err != nil {
return err
}
var subject string
var content string
switch token.Type {
case models.ConfirmMagicToken:
link := fmt.Sprintf("%s/flow/accounts/confirm?code=%s", viper.GetString("frontend_app"), token.Code)
subject = fmt.Sprintf("[%s] %s", viper.GetString("name"), GetLocalizedString("subjectConfirmRegistration", user.Language))
content = RenderLocalizedTemplateHTML("register-confirm.tmpl", user.Language, map[string]any{
"User": user,
"Link": link,
})
2024-06-30 17:01:39 +08:00
case models.ResetPasswordMagicToken:
link := fmt.Sprintf("%s/flow/accounts/password-reset?code=%s", viper.GetString("frontend_app"), token.Code)
subject = fmt.Sprintf("[%s] %s", viper.GetString("name"), GetLocalizedString("subjectResetPassword", user.Language))
content = RenderLocalizedTemplateHTML("reset-password.tmpl", user.Language, map[string]any{
"User": user,
"Link": link,
})
2024-09-19 22:18:22 +08:00
case models.DeleteAccountMagicToken:
link := fmt.Sprintf("%s/flow/accounts/deletion?code=%s", viper.GetString("frontend_app"), token.Code)
subject = fmt.Sprintf("[%s] %s", viper.GetString("name"), GetLocalizedString("subjectDeleteAccount", user.Language))
content = RenderLocalizedTemplateHTML("confirm-deletion.tmpl", user.Language, map[string]any{
"User": user,
"Link": link,
})
2024-01-29 00:32:39 +08:00
default:
return fmt.Errorf("unsupported magic token type to notify")
}
2024-10-27 00:06:23 +08:00
err := gap.Px.PushEmail(pushkit.EmailDeliverRequest{
To: user.GetPrimaryEmail().Content,
2024-10-27 00:06:23 +08:00
Email: pushkit.EmailData{
Subject: subject,
2025-02-01 18:27:57 +08:00
HTML: &content,
},
})
return err
2024-01-29 00:32:39 +08:00
}