Monorepo for Tangled
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

appview/ingester: ingest vouch records

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

authored by

oppiliappan and committed by
Tangled
84a9430c 2015bbf1

+74
+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: ··· 200 202 201 203 if err != nil { 202 204 return fmt.Errorf("failed to %s follow record: %w", e.Commit.Operation, err) 205 + } 206 + 207 + return nil 208 + } 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) 203 277 } 204 278 205 279 return nil