Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var ( // ErrUserNotFound is returned when a user is not found, which is equivalent // to saying the user has not been invited ErrUserNotFound = errors.New("user not invited") // ErrInviteCountExceeded is returned when a new user is attempted to be // added to the database via an invite from someone who has reached // their max count or has never been invited. ErrInviteCountExceeded = errors.New("invite count exceeded") // ErrAlreadyExists is returned when a user already exists in the database. ErrAlreadyExists = errors.New("user already invited") // ErrInfluencerCodeAlreadyExists is returned when an influencer code already exists. ErrInfluencerCodeAlreadyExists = errors.New("influencer code already exists") // ErrInfluencerCodeNotFound is returned when an influencer code is not found. ErrInfluencerCodeNotFound = errors.New("influencer code not found") // ErrInfluencerCodeRevoked is returned when an influencer code is revoked. ErrInfluencerCodeRevoked = errors.New("influencer code revoked") // ErrInfluencerCodeExpired is returned when an influencer code is expired. ErrInfluencerCodeExpired = errors.New("influencer code expired") )
Functions ¶
This section is empty.
Types ¶
type InfluencerCode ¶
type InfluencerCode struct {
Code string
InviteCount uint32
InvitesSent uint32
IsRevoked bool
ExpiresAt time.Time
}
func (*InfluencerCode) Validate ¶
func (i *InfluencerCode) Validate() error
type Store ¶
type Store interface {
// GetUser gets an invited user.
GetUser(ctx context.Context, phoneNumber string) (*User, error)
// PutUser stores an invited user. If the inviter is provided, the function
// will verify that it is allowed to invite the user and will decrement its
// invite count on success.
PutUser(ctx context.Context, user *User) error
// GetInfluencerCode gets an influencer code.
GetInfluencerCode(ctx context.Context, code string) (*InfluencerCode, error)
// PutInfluencerCode stores an influencer code.
PutInfluencerCode(ctx context.Context, influencerCode *InfluencerCode) error
// ClaimInfluencerCode claims an influencer code.
ClaimInfluencerCode(ctx context.Context, code string) error
// FilterInvitedNumbers filters numbers that have been invited from the
// provided list and returns the associated set of users.
FilterInvitedNumbers(ctx context.Context, phoneNumbers []string) ([]*User, error)
// PutOnWaitlist puts a user on a waitlist for invitation
PutOnWaitlist(ctx context.Context, entry *WaitlistEntry) error
// GiveInvitesForDeposit one-time gives invites for depositing Kin into Code
GiveInvitesForDeposit(ctx context.Context, phoneNumber string, amount int) error
}
type User ¶
type User struct {
PhoneNumber string
InvitedBy *string
Invited time.Time
InviteCount uint32
InvitesSent uint32
DepositInvitesReceived bool
IsRevoked bool
}
This view of a user is intentionally separated from the pkg/code/data/user model. Invites are going to be a temporary phase of the app, and this makes a clear separation of what can be removed. As it's defined right now, invites are also grouped by phone number, whereas a user is a 1:1 mapping between an ID and (phone number, token account) pair.
Click to show internal directories.
Click to hide internal directories.