forked from tangled.org/core
Monorepo for Tangled

appview/repo: implement routers to subscribe and unsubscribe from labels

Signed-off-by: oppiliappan <me@oppi.li>

oppi.li 64db8694 d66a4745

verified
Changed files
+137 -1
appview
+134
appview/repo/repo.go
··· 1227 1227 rp.pages.HxRefresh(w) 1228 1228 } 1229 1229 1230 + func (rp *Repo) SubscribeLabel(w http.ResponseWriter, r *http.Request) { 1231 + user := rp.oauth.GetUser(r) 1232 + l := rp.logger.With("handler", "DeleteLabel") 1233 + l = l.With("did", user.Did) 1234 + l = l.With("handle", user.Handle) 1235 + 1236 + f, err := rp.repoResolver.Resolve(r) 1237 + if err != nil { 1238 + l.Error("failed to get repo and knot", "err", err) 1239 + return 1240 + } 1241 + 1242 + errorId := "label-operation" 1243 + fail := func(msg string, err error) { 1244 + l.Error(msg, "err", err) 1245 + rp.pages.Notice(w, errorId, msg) 1246 + } 1247 + 1248 + labelAt := r.FormValue("label") 1249 + _, err = db.GetLabelDefinition(rp.db, db.FilterEq("at_uri", labelAt)) 1250 + if err != nil { 1251 + fail("Failed to subscribe to label.", err) 1252 + return 1253 + } 1254 + 1255 + newRepo := f.Repo 1256 + newRepo.Labels = append(newRepo.Labels, labelAt) 1257 + repoRecord := newRepo.AsRecord() 1258 + 1259 + client, err := rp.oauth.AuthorizedClient(r) 1260 + if err != nil { 1261 + fail(err.Error(), err) 1262 + return 1263 + } 1264 + 1265 + ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, f.Repo.Did, f.Repo.Rkey) 1266 + if err != nil { 1267 + fail("Failed to update labels, no record found on PDS.", err) 1268 + return 1269 + } 1270 + _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 1271 + Collection: tangled.RepoNSID, 1272 + Repo: newRepo.Did, 1273 + Rkey: newRepo.Rkey, 1274 + SwapRecord: ex.Cid, 1275 + Record: &lexutil.LexiconTypeDecoder{ 1276 + Val: &repoRecord, 1277 + }, 1278 + }) 1279 + 1280 + err = db.SubscribeLabel(rp.db, &db.RepoLabel{ 1281 + RepoAt: f.RepoAt(), 1282 + LabelAt: syntax.ATURI(labelAt), 1283 + }) 1284 + if err != nil { 1285 + fail("Failed to subscribe to label.", err) 1286 + return 1287 + } 1288 + 1289 + // everything succeeded 1290 + rp.pages.HxRefresh(w) 1291 + } 1292 + 1293 + func (rp *Repo) UnsubscribeLabel(w http.ResponseWriter, r *http.Request) { 1294 + user := rp.oauth.GetUser(r) 1295 + l := rp.logger.With("handler", "DeleteLabel") 1296 + l = l.With("did", user.Did) 1297 + l = l.With("handle", user.Handle) 1298 + 1299 + f, err := rp.repoResolver.Resolve(r) 1300 + if err != nil { 1301 + l.Error("failed to get repo and knot", "err", err) 1302 + return 1303 + } 1304 + 1305 + errorId := "label-operation" 1306 + fail := func(msg string, err error) { 1307 + l.Error(msg, "err", err) 1308 + rp.pages.Notice(w, errorId, msg) 1309 + } 1310 + 1311 + labelAt := r.FormValue("label") 1312 + _, err = db.GetLabelDefinition(rp.db, db.FilterEq("at_uri", labelAt)) 1313 + if err != nil { 1314 + fail("Failed to unsubscribe to label.", err) 1315 + return 1316 + } 1317 + 1318 + // update repo record to remove the label reference 1319 + newRepo := f.Repo 1320 + var updated []string 1321 + for _, l := range newRepo.Labels { 1322 + if l != labelAt { 1323 + updated = append(updated, l) 1324 + } 1325 + } 1326 + newRepo.Labels = updated 1327 + repoRecord := newRepo.AsRecord() 1328 + 1329 + client, err := rp.oauth.AuthorizedClient(r) 1330 + if err != nil { 1331 + fail(err.Error(), err) 1332 + return 1333 + } 1334 + 1335 + ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, f.Repo.Did, f.Repo.Rkey) 1336 + if err != nil { 1337 + fail("Failed to update labels, no record found on PDS.", err) 1338 + return 1339 + } 1340 + _, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{ 1341 + Collection: tangled.RepoNSID, 1342 + Repo: newRepo.Did, 1343 + Rkey: newRepo.Rkey, 1344 + SwapRecord: ex.Cid, 1345 + Record: &lexutil.LexiconTypeDecoder{ 1346 + Val: &repoRecord, 1347 + }, 1348 + }) 1349 + 1350 + err = db.UnsubscribeLabel( 1351 + rp.db, 1352 + db.FilterEq("repo_at", f.RepoAt()), 1353 + db.FilterEq("label_at", labelAt), 1354 + ) 1355 + if err != nil { 1356 + fail("Failed to unsubscribe label.", err) 1357 + return 1358 + } 1359 + 1360 + // everything succeeded 1361 + rp.pages.HxRefresh(w) 1362 + } 1363 + 1230 1364 func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) { 1231 1365 user := rp.oauth.GetUser(r) 1232 1366 l := rp.logger.With("handler", "AddCollaborator")
+2
appview/repo/router.go
··· 78 78 r.With(mw.RepoPermissionMiddleware("repo:owner")).Post("/spindle", rp.EditSpindle) 79 79 r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label", rp.AddLabel) 80 80 r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label", rp.DeleteLabel) 81 + r.With(mw.RepoPermissionMiddleware("repo:owner")).Put("/label/subscribe", rp.SubscribeLabel) 82 + r.With(mw.RepoPermissionMiddleware("repo:owner")).Delete("/label/subscribe", rp.UnsubscribeLabel) 81 83 r.With(mw.RepoPermissionMiddleware("repo:invite")).Put("/collaborator", rp.AddCollaborator) 82 84 r.With(mw.RepoPermissionMiddleware("repo:delete")).Delete("/delete", rp.DeleteRepo) 83 85 r.Put("/branches/default", rp.SetDefaultBranch)
+1 -1
appview/state/router.go
··· 253 253 } 254 254 255 255 func (s *State) LabelsRouter(mw *middleware.Middleware) http.Handler { 256 - ls := labels.New(s.oauth, s.repoResolver, s.pages, s.spindlestream, s.idResolver, s.db, s.config, s.enforcer) 256 + ls := labels.New(s.oauth, s.pages, s.db, s.validator) 257 257 return ls.Router(mw) 258 258 } 259 259