Search Apps Documentation Source Content File Folder Download Copy Actions Download

logic.gno

2.40 Kb ยท 125 lines
  1package builders
  2
  3import (
  4	"chain/runtime"
  5	"strings"
  6	"time"
  7)
  8
  9func assertNonEmpty(v string, field string) {
 10	if strings.TrimSpace(v) == "" {
 11		panic("missing required field: " + field)
 12	}
 13}
 14
 15func assertValidRequestType(v string) {
 16	switch v {
 17	case "initial", "followup":
 18		return
 19	default:
 20		panic("invalid requestType: must be 'initial' or 'followup'")
 21	}
 22}
 23
 24func Submit(
 25	_ realm,
 26	twitterHandle string,
 27	discordHandle string,
 28	githubURL string,
 29	requestType string,
 30	applicationDetails string,
 31) {
 32	runtime.AssertOriginCall()
 33
 34	assertNonEmpty(twitterHandle, "twitterHandle")
 35	assertNonEmpty(discordHandle, "discordHandle")
 36	assertNonEmpty(githubURL, "githubURL")
 37	assertNonEmpty(applicationDetails, "applicationDetails")
 38	assertValidRequestType(requestType)
 39
 40	caller := applicantAddr()
 41	now := time.Now()
 42
 43	sub := GetSubmission(caller)
 44	if sub != nil {
 45		sub.Twitter = twitterHandle
 46		sub.Discord = discordHandle
 47		sub.GitHub = githubURL
 48		sub.RequestType = requestType
 49		sub.Details = applicationDetails
 50		sub.Status = StatusPending
 51		sub.ReviewNote = ""
 52		sub.SubmittedAt = now
 53		sub.ReviewedAt = time.Time{}
 54		sub.PaidAt = time.Time{}
 55		setSubmission(sub)
 56		return
 57	}
 58
 59	setSubmission(&Submission{
 60		Applicant:   caller,
 61		Twitter:     twitterHandle,
 62		Discord:     discordHandle,
 63		GitHub:      githubURL,
 64		RequestType: requestType,
 65		Details:     applicationDetails,
 66		Status:      StatusPending,
 67		SubmittedAt: now,
 68	})
 69}
 70
 71func Approve(_ realm, addr address, note string) {
 72	requireAdmin()
 73
 74	sub := GetSubmission(addr)
 75	if sub == nil {
 76		panic("submission not found")
 77	}
 78
 79	sub.Status = StatusApproved
 80	sub.ReviewNote = note
 81	sub.ReviewedAt = time.Now()
 82	setSubmission(sub)
 83}
 84
 85func Reject(_ realm, addr address, note string) {
 86	requireAdmin()
 87
 88	sub := GetSubmission(addr)
 89	if sub == nil {
 90		panic("submission not found")
 91	}
 92
 93	sub.Status = StatusRejected
 94	sub.ReviewNote = note
 95	sub.ReviewedAt = time.Now()
 96	setSubmission(sub)
 97}
 98
 99func MarkPaid(_ realm, addr address, note string) {
100	requireAdmin()
101
102	sub := GetSubmission(addr)
103	if sub == nil {
104		panic("submission not found")
105	}
106	if sub.Status != StatusApproved {
107		panic("submission must be approved before marking paid")
108	}
109
110	sub.Status = StatusPaid
111	sub.ReviewNote = note
112	sub.ReviewedAt = time.Now()
113	sub.PaidAt = time.Now()
114	setSubmission(sub)
115}
116
117func TransferAdmin(_ realm, newAdmin address) {
118	requireAdmin()
119
120	if newAdmin == "" {
121		panic("new admin cannot be empty")
122	}
123
124	admin = newAdmin
125}