60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/hash"
|
|
"RenewCMS/internal/domain/invite"
|
|
"RenewCMS/internal/domain/mail"
|
|
"RenewCMS/internal/domain/user"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type RenewInviteUseCase struct {
|
|
userRepository user.Repository
|
|
inviteRepository invite.Repository
|
|
hasher hash.Hasher
|
|
mailer inviteMailer
|
|
}
|
|
|
|
type RenewInviteCommand struct {
|
|
ID uint32
|
|
RenewedBy uint32
|
|
}
|
|
|
|
func NewRenewInviteUseCase(userRepository user.Repository, inviteRepository invite.Repository, hasher hash.Hasher, mailRepository mail.Repository, publicURL string) *RenewInviteUseCase {
|
|
return &RenewInviteUseCase{userRepository, inviteRepository, hasher, inviteMailer{mailRepository, publicURL}}
|
|
}
|
|
|
|
func (u *RenewInviteUseCase) RenewInvite(command RenewInviteCommand) (invite.Invite, error) {
|
|
now := time.Now()
|
|
|
|
renewer, err := u.userRepository.Get(command.RenewedBy)
|
|
if err != nil {
|
|
return invite.Invite{}, err
|
|
}
|
|
|
|
previous, err := findManageableInvite(u.inviteRepository, command.ID)
|
|
if err != nil {
|
|
return invite.Invite{}, err
|
|
}
|
|
|
|
rawCode, hashedCode, err := newInviteCode(u.hasher)
|
|
if err != nil {
|
|
return invite.Invite{}, err
|
|
}
|
|
|
|
renewed, err := u.inviteRepository.Renew(previous.ID, hashedCode, now.Add(invite.Lifetime), now)
|
|
if err != nil {
|
|
return invite.Invite{}, err
|
|
}
|
|
|
|
if sendErr := u.mailer.send(renewed.Email, rawCode, renewer); sendErr != nil {
|
|
if _, restoreErr := u.inviteRepository.Renew(previous.ID, previous.HashedCode, previous.ExpiresAt, previous.CreatedAt); restoreErr != nil {
|
|
return invite.Invite{}, errors.Join(sendErr, restoreErr)
|
|
}
|
|
return invite.Invite{}, sendErr
|
|
}
|
|
|
|
return renewed, nil
|
|
}
|