backend for xcvr appview

listen for medias

+168
+137
server/internal/atplistener/jetstream.go
··· 42 42 "org.xcvr.feed.channel", 43 43 "org.xcvr.lrc.message", 44 44 "org.xcvr.lrc.signet", 45 + "org.xcvr.lrc.media", 45 46 } 46 47 cfg.WantedDids = []string{} 47 48 return &Consumer{ ··· 84 85 return h.handleMessage(ctx, event) 85 86 case "org.xcvr.lrc.signet": 86 87 return h.handleSignet(ctx, event) 88 + case "org.xcvr.lrc.media": 89 + return h.handleMedia(ctx, event) 87 90 } 88 91 return nil 89 92 } ··· 335 338 StartedAt: then, 336 339 } 337 340 return &signet, nil 341 + } 342 + 343 + func (h *handler) handleMedia(ctx context.Context, event *models.Event) error { 344 + h.l.Deprintln("handling media") 345 + switch event.Commit.Operation { 346 + case "create": 347 + return h.handleMediaCreate(ctx, event) 348 + case "update": 349 + return h.handleMediaUpdate(ctx, event) 350 + case "delete": 351 + return h.handleMediaDelete(ctx, event) 352 + } 353 + return errors.New("unimplemented Operation") 354 + } 355 + 356 + func (h *handler) handleMediaCreate(ctx context.Context, event *models.Event) error { 357 + mr, err := parseMediaRecord(event) 358 + if err != nil { 359 + h.l.Deprintln(err.Error()) 360 + return nil 361 + } 362 + if mr.Image != nil { 363 + image, err := wrangeMediaRecordIntoImage(event, mr) 364 + if err != nil { 365 + h.l.Deprintln(err.Error()) 366 + return nil 367 + } 368 + err = h.rm.AcceptImage(image, ctx) 369 + if err != nil { 370 + h.l.Deprintln(err.Error()) 371 + return nil 372 + } 373 + return nil 374 + } 375 + return nil 376 + } 377 + 378 + func (h *handler) handleMediaUpdate(ctx context.Context, event *models.Event) error { 379 + mr, err := parseMediaRecord(event) 380 + if err != nil { 381 + h.l.Deprintln(err.Error()) 382 + return nil 383 + } 384 + if mr.Image != nil { 385 + image, err := wrangeMediaRecordIntoImage(event, mr) 386 + if err != nil { 387 + h.l.Deprintln(err.Error()) 388 + return nil 389 + } 390 + err = h.rm.AcceptImageUpdate(image, ctx) 391 + if err != nil { 392 + h.l.Deprintln(err.Error()) 393 + return nil 394 + } 395 + return nil 396 + } 397 + return nil 398 + } 399 + 400 + func (h *handler) handleMediaDelete(ctx context.Context, event *models.Event) error { 401 + mr, err := parseMediaRecord(event) 402 + if err != nil { 403 + h.l.Deprintln(err.Error()) 404 + return nil 405 + } 406 + if mr.Image != nil { 407 + image, err := wrangeMediaRecordIntoImage(event, mr) 408 + if err != nil { 409 + h.l.Deprintln(err.Error()) 410 + return nil 411 + } 412 + err = h.rm.AcceptImageDelete(image, ctx) 413 + if err != nil { 414 + h.l.Deprintln(err.Error()) 415 + return nil 416 + } 417 + return nil 418 + } 419 + return nil 420 + } 421 + 422 + func parseMediaRecord(event *models.Event) (*lex.MediaRecord, error) { 423 + var mr lex.MediaRecord 424 + err := json.Unmarshal(event.Commit.Record, &mr) 425 + if err != nil { 426 + return nil, errors.New("error unmarshl: " + err.Error()) 427 + } 428 + return &mr, nil 429 + } 430 + 431 + func wrangeMediaRecordIntoImage(event *models.Event, mr *lex.MediaRecord) (*types.Image, error) { 432 + if mr.Image != nil { 433 + then, err := syntax.ParseDatetimeTime(mr.PostedAt) 434 + if err != nil { 435 + then = time.Now() 436 + } 437 + var color *uint32 438 + if mr.Color != nil { 439 + c := uint32(*mr.Color) 440 + color = &c 441 + } 442 + var blobcid *string 443 + var blobmime *string 444 + if mr.Image.Blob != nil { 445 + bcid := mr.Image.Blob.Ref.String() 446 + bmime := mr.Image.Blob.MimeType 447 + blobcid = &bcid 448 + blobmime = &bmime 449 + } 450 + var width, height *int64 451 + if mr.Image.AspectRatio != nil { 452 + w := mr.Image.AspectRatio.Width 453 + h := mr.Image.AspectRatio.Height 454 + width = &w 455 + height = &h 456 + } 457 + image := types.Image{ 458 + URI: URI(event), 459 + DID: event.Did, 460 + SignetURI: mr.SignetURI, 461 + BlobCID: blobcid, 462 + BlobMIME: blobmime, 463 + Alt: mr.Image.Alt, 464 + Nick: mr.Nick, 465 + Color: color, 466 + CID: event.Commit.CID, 467 + Width: width, 468 + Height: height, 469 + PostedAt: then, 470 + } 471 + return &image, nil 472 + } 473 + return nil, errors.New("image should be non nil") 474 + 338 475 } 339 476 340 477 func URI(event *models.Event) string {
+31
server/internal/recordmanager/media.go
··· 62 62 } 63 63 } 64 64 65 + func (rm *RecordManager) AcceptImage(img *types.Image, ctx context.Context) error { 66 + wasNew, err := rm.db.StoreImage(img, ctx) 67 + if err != nil { 68 + return err 69 + } 70 + if !wasNew { 71 + return nil 72 + } 73 + err = rm.forwardImage(img, ctx) 74 + if err != nil { 75 + return errors.New("error forwarding image: " + err.Error()) 76 + } 77 + return nil 78 + } 79 + 80 + func (rm *RecordManager) AcceptImageUpdate(img *types.Image, ctx context.Context) error { 81 + err := rm.db.UpdateImage(img, ctx) 82 + if err != nil { 83 + return err 84 + } 85 + return nil 86 + } 87 + 88 + func (rm *RecordManager) AcceptImageDelete(img *types.Image, ctx context.Context) error { 89 + err := rm.db.DeleteImage(img.URI, ctx) 90 + if err != nil { 91 + return err 92 + } 93 + return nil 94 + } 95 + 65 96 func (rm *RecordManager) postImageRecord(cs *atoauth.ClientSession, mr *types.ParseMediaRequest, ctx context.Context) error { 66 97 imr, now, err := rm.validateImageRecord(mr, ctx) 67 98 if err != nil {