+134
appview/repo/repo.go
+134
appview/repo/repo.go
···
1203
1203
rp.pages.HxRefresh(w)
1204
1204
}
1205
1205
1206
+
func (rp *Repo) SubscribeLabel(w http.ResponseWriter, r *http.Request) {
1207
+
user := rp.oauth.GetUser(r)
1208
+
l := rp.logger.With("handler", "DeleteLabel")
1209
+
l = l.With("did", user.Did)
1210
+
l = l.With("handle", user.Handle)
1211
+
1212
+
f, err := rp.repoResolver.Resolve(r)
1213
+
if err != nil {
1214
+
l.Error("failed to get repo and knot", "err", err)
1215
+
return
1216
+
}
1217
+
1218
+
errorId := "label-operation"
1219
+
fail := func(msg string, err error) {
1220
+
l.Error(msg, "err", err)
1221
+
rp.pages.Notice(w, errorId, msg)
1222
+
}
1223
+
1224
+
labelAt := r.FormValue("label")
1225
+
_, err = db.GetLabelDefinition(rp.db, db.FilterEq("at_uri", labelAt))
1226
+
if err != nil {
1227
+
fail("Failed to subscribe to label.", err)
1228
+
return
1229
+
}
1230
+
1231
+
newRepo := f.Repo
1232
+
newRepo.Labels = append(newRepo.Labels, labelAt)
1233
+
repoRecord := newRepo.AsRecord()
1234
+
1235
+
client, err := rp.oauth.AuthorizedClient(r)
1236
+
if err != nil {
1237
+
fail(err.Error(), err)
1238
+
return
1239
+
}
1240
+
1241
+
ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, f.Repo.Did, f.Repo.Rkey)
1242
+
if err != nil {
1243
+
fail("Failed to update labels, no record found on PDS.", err)
1244
+
return
1245
+
}
1246
+
_, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
1247
+
Collection: tangled.RepoNSID,
1248
+
Repo: newRepo.Did,
1249
+
Rkey: newRepo.Rkey,
1250
+
SwapRecord: ex.Cid,
1251
+
Record: &lexutil.LexiconTypeDecoder{
1252
+
Val: &repoRecord,
1253
+
},
1254
+
})
1255
+
1256
+
err = db.SubscribeLabel(rp.db, &db.RepoLabel{
1257
+
RepoAt: f.RepoAt(),
1258
+
LabelAt: syntax.ATURI(labelAt),
1259
+
})
1260
+
if err != nil {
1261
+
fail("Failed to subscribe to label.", err)
1262
+
return
1263
+
}
1264
+
1265
+
// everything succeeded
1266
+
rp.pages.HxRefresh(w)
1267
+
}
1268
+
1269
+
func (rp *Repo) UnsubscribeLabel(w http.ResponseWriter, r *http.Request) {
1270
+
user := rp.oauth.GetUser(r)
1271
+
l := rp.logger.With("handler", "DeleteLabel")
1272
+
l = l.With("did", user.Did)
1273
+
l = l.With("handle", user.Handle)
1274
+
1275
+
f, err := rp.repoResolver.Resolve(r)
1276
+
if err != nil {
1277
+
l.Error("failed to get repo and knot", "err", err)
1278
+
return
1279
+
}
1280
+
1281
+
errorId := "label-operation"
1282
+
fail := func(msg string, err error) {
1283
+
l.Error(msg, "err", err)
1284
+
rp.pages.Notice(w, errorId, msg)
1285
+
}
1286
+
1287
+
labelAt := r.FormValue("label")
1288
+
_, err = db.GetLabelDefinition(rp.db, db.FilterEq("at_uri", labelAt))
1289
+
if err != nil {
1290
+
fail("Failed to unsubscribe to label.", err)
1291
+
return
1292
+
}
1293
+
1294
+
// update repo record to remove the label reference
1295
+
newRepo := f.Repo
1296
+
var updated []string
1297
+
for _, l := range newRepo.Labels {
1298
+
if l != labelAt {
1299
+
updated = append(updated, l)
1300
+
}
1301
+
}
1302
+
newRepo.Labels = updated
1303
+
repoRecord := newRepo.AsRecord()
1304
+
1305
+
client, err := rp.oauth.AuthorizedClient(r)
1306
+
if err != nil {
1307
+
fail(err.Error(), err)
1308
+
return
1309
+
}
1310
+
1311
+
ex, err := client.RepoGetRecord(r.Context(), "", tangled.RepoNSID, f.Repo.Did, f.Repo.Rkey)
1312
+
if err != nil {
1313
+
fail("Failed to update labels, no record found on PDS.", err)
1314
+
return
1315
+
}
1316
+
_, err = client.RepoPutRecord(r.Context(), &comatproto.RepoPutRecord_Input{
1317
+
Collection: tangled.RepoNSID,
1318
+
Repo: newRepo.Did,
1319
+
Rkey: newRepo.Rkey,
1320
+
SwapRecord: ex.Cid,
1321
+
Record: &lexutil.LexiconTypeDecoder{
1322
+
Val: &repoRecord,
1323
+
},
1324
+
})
1325
+
1326
+
err = db.UnsubscribeLabel(
1327
+
rp.db,
1328
+
db.FilterEq("repo_at", f.RepoAt()),
1329
+
db.FilterEq("label_at", labelAt),
1330
+
)
1331
+
if err != nil {
1332
+
fail("Failed to unsubscribe label.", err)
1333
+
return
1334
+
}
1335
+
1336
+
// everything succeeded
1337
+
rp.pages.HxRefresh(w)
1338
+
}
1339
+
1206
1340
func (rp *Repo) AddCollaborator(w http.ResponseWriter, r *http.Request) {
1207
1341
user := rp.oauth.GetUser(r)
1208
1342
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
···
252
252
}
253
253
254
254
func (s *State) LabelsRouter(mw *middleware.Middleware) http.Handler {
255
-
ls := labels.New(s.oauth, s.repoResolver, s.pages, s.spindlestream, s.idResolver, s.db, s.config, s.enforcer)
255
+
ls := labels.New(s.oauth, s.pages, s.db, s.validator)
256
256
return ls.Router(mw)
257
257
}
258
258