+134
appview/repo/repo.go
+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
+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
+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