19 | _
=> raise C
.Sql
"Bad status"
28 fun statusFromSql v
= statusFromInt (C
.intFromSql v
)
29 fun statusToSql s
= C
.intToSql (statusToInt s
)
31 type app
= { id
: int, name
: string, rname
: string, email
: string,
32 forward
: bool, uses
: string, other
: string,
33 passwd
: string, status
: status
, applied
: C
.timestamp
,
34 confirmed
: C
.timestamp option
, decided
: C
.timestamp option
,
37 fun mkAppRow
[id
, name
, rname
, email
, forward
, uses
, other
, passwd
, status
, applied
, confirmed
, decided
, msg
] =
38 { id
= C
.intFromSql id
, name
= C
.stringFromSql name
, rname
= C
.stringFromSql rname
,
39 email
= C
.stringFromSql email
, forward
= C
.boolFromSql forward
,
40 uses
= C
.stringFromSql uses
, other
= C
.stringFromSql other
, passwd
= C
.stringFromSql passwd
,
41 status
= statusFromSql status
, applied
= C
.timestampFromSql applied
,
42 confirmed
= if C
.isNull confirmed
then NONE
else SOME (C
.timestampFromSql confirmed
),
43 decided
= if C
.isNull decided
then NONE
else SOME (C
.timestampFromSql decided
),
44 msg
= C
.stringFromSql msg
}
45 | mkAppRow r
= rowError ("app", r
)
48 case C
.oneOrNoRows (getDb ()) ($`SELECT id
, name
, rname
, email
, forward
, uses
, other
, passwd
, status
, applied
, confirmed
, decided
, msg
50 WHERE id
= ^
(C
.intToSql id
)`
) of
51 SOME row
=> mkAppRow row
52 | NONE
=> raise Fail
"Membership application not found"
55 C
.map (getDb ()) mkAppRow ($`SELECT id
, name
, rname
, email
, forward
, uses
, other
, passwd
, status
, applied
, confirmed
, decided
, msg
60 fun mkVoteRow
[id
, name
] = (C
.intFromSql id
, C
.stringFromSql name
)
61 | mkVoteRow row
= rowError ("app.vote", row
)
63 fun votes id
= C
.map (getDb ()) mkVoteRow ($`SELECT usr
, name
64 FROM AppVote JOIN WebUser ON usr
= id
65 WHERE app
= ^
(C
.intToSql id
)
68 fun vote (usr
, app
) = ignore (C
.dml (getDb ()) ($`INSERT INTO
AppVote (app
, usr
)
69 VALUES (^
(C
.intToSql app
), ^
(C
.intToSql usr
))`
))
71 fun unvote (usr
, app
) = ignore (C
.dml (getDb ()) ($`DELETE FROM AppVote WHERE app
= ^
(C
.intToSql app
) AND usr
= ^
(C
.intToSql usr
)`
))
75 val entry
= lookupApp app
76 val _
= C
.dml (getDb ()) ($`UPDATE MemberApp
77 SET status
= 3, msg
= ^
(C
.stringToSql msg
), decided
= CURRENT_TIMESTAMP
78 WHERE id
= ^
(C
.intToSql app
)`
)
80 val mail
= Mail
.mopen ()
82 Mail
.mwrite (mail
, "From: Hcoop Application System <join@hcoop.net>\nTo: ");
83 Mail
.mwrite (mail
, #email entry
);
84 Mail
.mwrite (mail
, "\nCc: ");
85 Mail
.mwrite (mail
, boardEmail
);
86 Mail
.mwrite (mail
, "\nSubject: Application denied\n\nYour application for membership has been denied. Reason:\n\n");
87 Mail
.mwrite (mail
, msg
);
88 OS
.Process
.isSuccess (Mail
.mclose mail
)
91 fun approve (app
, msg
) =
93 val entry
= lookupApp app
94 val _
= C
.dml (getDb ()) ($`UPDATE MemberApp
95 SET status
= 2, msg
= ^
(C
.stringToSql msg
), decided
= CURRENT_TIMESTAMP
96 WHERE id
= ^
(C
.intToSql app
)`
)
98 val mail
= Mail
.mopen ()
100 Mail
.mwrite (mail
, "From: Hcoop Application System <join@hcoop.net>\nTo: ");
101 Mail
.mwrite (mail
, #email entry
);
102 Mail
.mwrite (mail
, "\nCc: ");
103 Mail
.mwrite (mail
, boardEmail
);
104 Mail
.mwrite (mail
, "\nSubject: Application approved\n\nYour application for membership has been approved! Welcome to hcoop!\n\n");
105 Mail
.mwrite (mail
, msg
);
106 OS
.Process
.isSuccess (Mail
.mclose mail
)