Skip to content
This repository was archived by the owner on Feb 4, 2021. It is now read-only.

Commit 95dea46

Browse files
committed
Impl CreateInvitation
1 parent 601c843 commit 95dea46

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

infra/store/invitation/invitation_store.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,17 @@ package invitationstore
22

33
import (
44
"context"
5+
"crypto/rand"
56
"database/sql"
7+
"encoding/base32"
8+
"strings"
9+
10+
"github.com/pkg/errors"
11+
"github.com/volatiletech/sqlboiler/boil"
612

713
"github.com/ProgrammingLab/prolab-accounts/infra/record"
814
"github.com/ProgrammingLab/prolab-accounts/infra/store"
15+
"github.com/ProgrammingLab/prolab-accounts/model"
916
)
1017

1118
type invitationStoreImpl struct {
@@ -21,6 +28,10 @@ func NewInvitationStore(ctx context.Context, db *sql.DB) store.InvitationStore {
2128
}
2229
}
2330

31+
const (
32+
invitationCodeBytes = 32
33+
)
34+
2435
func (s *invitationStoreImpl) ListInvitations() ([]*record.Invitation, error) {
2536
panic("not implemented")
2637
}
@@ -29,10 +40,36 @@ func (s *invitationStoreImpl) GetInvitation(id int64) (*record.Invitation, error
2940
panic("not implemented")
3041
}
3142

32-
func (s *invitationStoreImpl) CreateInvitation(email string) (*record.Invitation, error) {
33-
panic("not implemented")
43+
func (s *invitationStoreImpl) CreateInvitation(inviter model.UserID, email string) (*record.Invitation, error) {
44+
code, err := generateInvitationCode()
45+
if err != nil {
46+
return nil, err
47+
}
48+
49+
inv := &record.Invitation{
50+
Code: code,
51+
Email: email,
52+
InviterID: int64(inviter),
53+
}
54+
err = inv.Insert(s.ctx, s.db, boil.Infer())
55+
if err != nil {
56+
return nil, errors.WithStack(err)
57+
}
58+
59+
return inv, nil
3460
}
3561

3662
func (s *invitationStoreImpl) DeleteInvitation(id int64) error {
3763
panic("not implemented")
3864
}
65+
66+
func generateInvitationCode() (string, error) {
67+
b := make([]byte, invitationCodeBytes)
68+
_, err := rand.Read(b)
69+
if err != nil {
70+
return "", errors.WithStack(err)
71+
}
72+
73+
enc := base32.StdEncoding.WithPadding(base32.NoPadding)
74+
return strings.ToLower(enc.EncodeToString(b)), nil
75+
}

infra/store/invitation_store.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package store
22

33
import (
44
"github.com/ProgrammingLab/prolab-accounts/infra/record"
5+
"github.com/ProgrammingLab/prolab-accounts/model"
56
)
67

78
// InvitationStore provides invitations
89
type InvitationStore interface {
910
ListInvitations() ([]*record.Invitation, error)
1011
GetInvitation(id int64) (*record.Invitation, error)
11-
CreateInvitation(email string) (*record.Invitation, error)
12+
CreateInvitation(inviter model.UserID, email string) (*record.Invitation, error)
1213
DeleteInvitation(id int64) error
1314
}

0 commit comments

Comments
 (0)