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}