Diffdown is a real-time collaborative Markdown editor/previewer built on the AT Protocol diffdown.com
at main 54 lines 1.2 kB view raw
1package collaboration 2 3import ( 4 "crypto/rand" 5 "crypto/sha256" 6 "encoding/hex" 7 "fmt" 8 "time" 9 10 "github.com/limeleaf/diffdown/internal/db" 11 "github.com/limeleaf/diffdown/internal/model" 12) 13 14func GenerateInviteToken() (string, error) { 15 bytes := make([]byte, 32) 16 if _, err := rand.Read(bytes); err != nil { 17 return "", err 18 } 19 hash := sha256.Sum256(bytes) 20 return hex.EncodeToString(hash[:]), nil 21} 22 23func CreateInvite(database *db.DB, documentRKey, createdByDID string) (*model.Invite, error) { 24 token, err := GenerateInviteToken() 25 if err != nil { 26 return nil, err 27 } 28 29 invite := &model.Invite{ 30 ID: db.NewID(), 31 DocumentRKey: documentRKey, 32 Token: token, 33 CreatedBy: createdByDID, 34 CreatedAt: time.Now(), 35 ExpiresAt: time.Now().Add(7 * 24 * time.Hour), 36 } 37 38 err = database.CreateInvite(invite) 39 return invite, err 40} 41 42func ValidateInvite(database *db.DB, token, documentRKey string) (*model.Invite, error) { 43 invite, err := database.GetInviteByToken(token) 44 if err != nil { 45 return nil, err 46 } 47 if invite.DocumentRKey != documentRKey { 48 return nil, fmt.Errorf("invite does not match document") 49 } 50 if time.Now().After(invite.ExpiresAt) { 51 return nil, fmt.Errorf("invite expired") 52 } 53 return invite, nil 54}