Signed-off-by: oppiliappan me@oppi.li
+74
Diff
round #2
+74
appview/ingester.go
+74
appview/ingester.go
···
67
67
switch e.Commit.Collection {
68
68
case tangled.GraphFollowNSID:
69
69
err = i.ingestFollow(e)
70
+
case tangled.GraphVouchNSID:
71
+
err = i.ingestVouch(ctx, e)
70
72
case tangled.FeedStarNSID:
71
73
err = i.ingestStar(e)
72
74
case tangled.PublicKeyNSID:
···
205
207
return nil
206
208
}
207
209
210
+
func (i *Ingester) ingestVouch(ctx context.Context, e *jmodels.Event) error {
211
+
var err error
212
+
did := e.Did
213
+
214
+
l := i.Logger.With("handler", "ingestVouch")
215
+
l = l.With("nsid", e.Commit.Collection)
216
+
l.Info("ingesting vouch")
217
+
218
+
switch e.Commit.Operation {
219
+
case jmodels.CommitOperationCreate, jmodels.CommitOperationUpdate:
220
+
raw := json.RawMessage(e.Commit.Record)
221
+
record := tangled.GraphVouch{}
222
+
err = json.Unmarshal(raw, &record)
223
+
if err != nil {
224
+
l.Error("invalid record", "err", err)
225
+
return err
226
+
}
227
+
228
+
// rkey is the subject_did being vouched for/denounced
229
+
subjectDID := e.Commit.RKey
230
+
231
+
_, err = syntax.ParseDID(subjectDID)
232
+
if err != nil {
233
+
l.Error("invalid subject_did in rkey", "err", err, "rkey", subjectDID)
234
+
return fmt.Errorf("invalid subject_did: %w", err)
235
+
}
236
+
237
+
if did == subjectDID {
238
+
l.Warn("attempted self-vouch", "did", did)
239
+
return fmt.Errorf("cannot vouch for self")
240
+
}
241
+
242
+
subjectId, err := i.IdResolver.ResolveIdent(ctx, subjectDID)
243
+
if err != nil {
244
+
return err
245
+
}
246
+
247
+
if subjectId.Handle.IsInvalidHandle() {
248
+
return err
249
+
}
250
+
251
+
kind, err := models.ParseVouchKind(record.Kind)
252
+
if err != nil {
253
+
l.Error("invalid kind", "kind", kind)
254
+
return fmt.Errorf("invalid kind: %s", kind)
255
+
}
256
+
257
+
recordCid, err := cid.Parse(e.Commit.CID)
258
+
if err != nil {
259
+
l.Error("invalid cid", "err", err, "cid", e.Commit.CID)
260
+
return fmt.Errorf("invalid cid: %w", err)
261
+
}
262
+
263
+
err = db.AddVouch(i.Db, &models.Vouch{
264
+
Did: syntax.DID(did),
265
+
SubjectDid: subjectId.DID,
266
+
Cid: recordCid,
267
+
Kind: kind,
268
+
Reason: record.Reason,
269
+
})
270
+
271
+
case jmodels.CommitOperationDelete:
272
+
err = db.DeleteVouchByRkey(i.Db, did, e.Commit.RKey)
273
+
}
274
+
275
+
if err != nil {
276
+
return fmt.Errorf("failed to %s vouch record: %w", e.Commit.Operation, err)
277
+
}
278
+
279
+
return nil
280
+
}
281
+
208
282
func (i *Ingester) ingestPublicKey(e *jmodels.Event) error {
209
283
did := e.Did
210
284
var err error