💾 Archived View for gemini.rmf-dev.com › repo › Vaati › Gemigit › files › ceb629cb442b60b7ef07041694… captured on 2024-02-05 at 09:47:31. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
0 package gmi
1
2 import (
3 "gemigit/db"
4 "gemigit/csrf"
5
6 "github.com/pitr/gig"
7 )
8
9 func groupRedirect(c gig.Context) error {
10 return c.NoContent(gig.StatusRedirectTemporary, "/account/" +
11 csrf.Token(c.CertHash()) + "/groups/" + c.Param("group"))
12 }
13
14 func groupsListRedirect(c gig.Context) error {
15 return c.NoContent(gig.StatusRedirectTemporary, "/account/" +
16 csrf.Token(c.CertHash()) + "/groups")
17 }
18
19 func isGroupOwner(c gig.Context) (int, error) {
20 user, exist := db.GetUser(c.CertHash())
21 if !exist {
22 return -1, c.NoContent(gig.StatusBadRequest,
23 "Invalid username")
24 }
25 groupID, err := db.GetGroupID(c.Param("group"))
26 if err != nil {
27 return -1, c.NoContent(gig.StatusBadRequest, err.Error())
28 }
29 owner, err := user.IsInGroupID(groupID)
30 if err != nil {
31 return -1, c.NoContent(gig.StatusBadRequest, err.Error())
32 }
33 if !owner {
34 return -1, c.NoContent(gig.StatusBadRequest,
35 "Permission denied")
36 }
37 return groupID, nil
38 }
39
40 func SetGroupDesc(c gig.Context) error {
41 query, err := c.QueryString()
42 if err != nil {
43 return c.NoContent(gig.StatusBadRequest, err.Error())
44 }
45 if query == "" {
46 return c.NoContent(gig.StatusInput, "Description")
47 }
48
49 id, err := isGroupOwner(c)
50 if err != nil {
51 return err
52 }
53
54 err = db.SetGroupDescription(id, query)
55 if err != nil {
56 return err
57 }
58 return groupRedirect(c)
59 }
60
61 func DeleteGroup(c gig.Context) error {
62 name, err := c.QueryString()
63 if err != nil {
64 return c.NoContent(gig.StatusBadRequest,
65 "Invalid input received")
66 }
67 if name == "" {
68 return c.NoContent(gig.StatusInput,
69 "To confirm type the group name")
70 }
71 if name != c.Param("group") {
72 return groupRedirect(c)
73 }
74 id, err := isGroupOwner(c)
75 if err != nil {
76 return c.NoContent(gig.StatusBadRequest, err.Error())
77 }
78 err = db.DeleteGroup(id)
79 if err != nil {
80 return c.NoContent(gig.StatusBadRequest, err.Error())
81 }
82 return groupsListRedirect(c)
83 }
84
85 func LeaveGroup(c gig.Context) (error) {
86 user, exist := db.GetUser(c.CertHash())
87 if !exist {
88 return c.NoContent(gig.StatusBadRequest,
89 "Invalid username")
90 }
91 groupID, err := db.GetGroupID(c.Param("group"))
92 if err != nil {
93 return c.NoContent(gig.StatusBadRequest, err.Error())
94 }
95 owner, err := user.IsInGroupID(groupID)
96 if err != nil {
97 return c.NoContent(gig.StatusBadRequest, err.Error())
98 }
99 if owner {
100 return c.NoContent(gig.StatusBadRequest,
101 "You cannot leave your own group")
102 }
103 err = db.DeleteMember(user.ID, groupID)
104 if err != nil {
105 return c.NoContent(gig.StatusBadRequest, err.Error())
106 }
107 return groupsListRedirect(c)
108 }
109
110 func RmFromGroup(c gig.Context) (error) {
111 groupID, err := isGroupOwner(c)
112 if err != nil {
113 return c.NoContent(gig.StatusBadRequest, err.Error())
114 }
115 userID, err := db.GetUserID(c.Param("user"))
116 if err != nil {
117 return c.NoContent(gig.StatusBadRequest, err.Error())
118 }
119 user, exist := db.GetUser(c.CertHash())
120 if !exist {
121 return c.NoContent(gig.StatusBadRequest,
122 "Invalid username")
123 }
124 if userID == user.ID {
125 return c.NoContent(gig.StatusBadRequest,
126 "You cannot remove yourself from your own group")
127 }
128 err = db.DeleteMember(userID, groupID)
129 if err != nil {
130 return c.NoContent(gig.StatusBadRequest, err.Error())
131 }
132 return groupRedirect(c)
133 }
134
135 func AddToGroup(c gig.Context) (error) {
136 query, err := c.QueryString()
137 if err != nil {
138 return c.NoContent(gig.StatusBadRequest, err.Error())
139 }
140 if query == "" {
141 return c.NoContent(gig.StatusInput, "Username")
142 }
143
144 user, exist := db.GetUser(c.CertHash())
145 if !exist {
146 return c.NoContent(gig.StatusBadRequest,
147 "Invalid username")
148 }
149
150 group := c.Param("group")
151 owner, err := user.IsInGroup(group)
152 if err != nil {
153 return c.NoContent(gig.StatusBadRequest, err.Error())
154 }
155 if !owner {
156 return c.NoContent(gig.StatusBadRequest, "Permission denied")
157 }
158
159 if err = user.AddUserToGroup(group, query); err != nil {
160 return c.NoContent(gig.StatusBadRequest, err.Error())
161 }
162 return groupRedirect(c)
163 }
164