package collaboration import ( "crypto/rand" "crypto/sha256" "encoding/hex" "fmt" "time" "github.com/limeleaf/diffdown/internal/db" "github.com/limeleaf/diffdown/internal/model" ) func GenerateInviteToken() (string, error) { bytes := make([]byte, 32) if _, err := rand.Read(bytes); err != nil { return "", err } hash := sha256.Sum256(bytes) return hex.EncodeToString(hash[:]), nil } func CreateInvite(database *db.DB, documentRKey, createdByDID string) (*model.Invite, error) { token, err := GenerateInviteToken() if err != nil { return nil, err } invite := &model.Invite{ ID: db.NewID(), DocumentRKey: documentRKey, Token: token, CreatedBy: createdByDID, CreatedAt: time.Now(), ExpiresAt: time.Now().Add(7 * 24 * time.Hour), } err = database.CreateInvite(invite) return invite, err } func ValidateInvite(database *db.DB, token, documentRKey string) (*model.Invite, error) { invite, err := database.GetInviteByToken(token) if err != nil { return nil, err } if invite.DocumentRKey != documentRKey { return nil, fmt.Errorf("invite does not match document") } if time.Now().After(invite.ExpiresAt) { return nil, fmt.Errorf("invite expired") } return invite, nil }