tangled
alpha
login
or
join now
moth11.net
/
rvcx
3
fork
atom
backend for xcvr appview
3
fork
atom
overview
issues
4
pulls
pipelines
listen for medias
moth11.net
4 months ago
1498e22f
93c5de95
+168
2 changed files
expand all
collapse all
unified
split
server
internal
atplistener
jetstream.go
recordmanager
media.go
+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
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
88
+
case "org.xcvr.lrc.media":
89
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
341
+
}
342
342
+
343
343
+
func (h *handler) handleMedia(ctx context.Context, event *models.Event) error {
344
344
+
h.l.Deprintln("handling media")
345
345
+
switch event.Commit.Operation {
346
346
+
case "create":
347
347
+
return h.handleMediaCreate(ctx, event)
348
348
+
case "update":
349
349
+
return h.handleMediaUpdate(ctx, event)
350
350
+
case "delete":
351
351
+
return h.handleMediaDelete(ctx, event)
352
352
+
}
353
353
+
return errors.New("unimplemented Operation")
354
354
+
}
355
355
+
356
356
+
func (h *handler) handleMediaCreate(ctx context.Context, event *models.Event) error {
357
357
+
mr, err := parseMediaRecord(event)
358
358
+
if err != nil {
359
359
+
h.l.Deprintln(err.Error())
360
360
+
return nil
361
361
+
}
362
362
+
if mr.Image != nil {
363
363
+
image, err := wrangeMediaRecordIntoImage(event, mr)
364
364
+
if err != nil {
365
365
+
h.l.Deprintln(err.Error())
366
366
+
return nil
367
367
+
}
368
368
+
err = h.rm.AcceptImage(image, ctx)
369
369
+
if err != nil {
370
370
+
h.l.Deprintln(err.Error())
371
371
+
return nil
372
372
+
}
373
373
+
return nil
374
374
+
}
375
375
+
return nil
376
376
+
}
377
377
+
378
378
+
func (h *handler) handleMediaUpdate(ctx context.Context, event *models.Event) error {
379
379
+
mr, err := parseMediaRecord(event)
380
380
+
if err != nil {
381
381
+
h.l.Deprintln(err.Error())
382
382
+
return nil
383
383
+
}
384
384
+
if mr.Image != nil {
385
385
+
image, err := wrangeMediaRecordIntoImage(event, mr)
386
386
+
if err != nil {
387
387
+
h.l.Deprintln(err.Error())
388
388
+
return nil
389
389
+
}
390
390
+
err = h.rm.AcceptImageUpdate(image, ctx)
391
391
+
if err != nil {
392
392
+
h.l.Deprintln(err.Error())
393
393
+
return nil
394
394
+
}
395
395
+
return nil
396
396
+
}
397
397
+
return nil
398
398
+
}
399
399
+
400
400
+
func (h *handler) handleMediaDelete(ctx context.Context, event *models.Event) error {
401
401
+
mr, err := parseMediaRecord(event)
402
402
+
if err != nil {
403
403
+
h.l.Deprintln(err.Error())
404
404
+
return nil
405
405
+
}
406
406
+
if mr.Image != nil {
407
407
+
image, err := wrangeMediaRecordIntoImage(event, mr)
408
408
+
if err != nil {
409
409
+
h.l.Deprintln(err.Error())
410
410
+
return nil
411
411
+
}
412
412
+
err = h.rm.AcceptImageDelete(image, ctx)
413
413
+
if err != nil {
414
414
+
h.l.Deprintln(err.Error())
415
415
+
return nil
416
416
+
}
417
417
+
return nil
418
418
+
}
419
419
+
return nil
420
420
+
}
421
421
+
422
422
+
func parseMediaRecord(event *models.Event) (*lex.MediaRecord, error) {
423
423
+
var mr lex.MediaRecord
424
424
+
err := json.Unmarshal(event.Commit.Record, &mr)
425
425
+
if err != nil {
426
426
+
return nil, errors.New("error unmarshl: " + err.Error())
427
427
+
}
428
428
+
return &mr, nil
429
429
+
}
430
430
+
431
431
+
func wrangeMediaRecordIntoImage(event *models.Event, mr *lex.MediaRecord) (*types.Image, error) {
432
432
+
if mr.Image != nil {
433
433
+
then, err := syntax.ParseDatetimeTime(mr.PostedAt)
434
434
+
if err != nil {
435
435
+
then = time.Now()
436
436
+
}
437
437
+
var color *uint32
438
438
+
if mr.Color != nil {
439
439
+
c := uint32(*mr.Color)
440
440
+
color = &c
441
441
+
}
442
442
+
var blobcid *string
443
443
+
var blobmime *string
444
444
+
if mr.Image.Blob != nil {
445
445
+
bcid := mr.Image.Blob.Ref.String()
446
446
+
bmime := mr.Image.Blob.MimeType
447
447
+
blobcid = &bcid
448
448
+
blobmime = &bmime
449
449
+
}
450
450
+
var width, height *int64
451
451
+
if mr.Image.AspectRatio != nil {
452
452
+
w := mr.Image.AspectRatio.Width
453
453
+
h := mr.Image.AspectRatio.Height
454
454
+
width = &w
455
455
+
height = &h
456
456
+
}
457
457
+
image := types.Image{
458
458
+
URI: URI(event),
459
459
+
DID: event.Did,
460
460
+
SignetURI: mr.SignetURI,
461
461
+
BlobCID: blobcid,
462
462
+
BlobMIME: blobmime,
463
463
+
Alt: mr.Image.Alt,
464
464
+
Nick: mr.Nick,
465
465
+
Color: color,
466
466
+
CID: event.Commit.CID,
467
467
+
Width: width,
468
468
+
Height: height,
469
469
+
PostedAt: then,
470
470
+
}
471
471
+
return &image, nil
472
472
+
}
473
473
+
return nil, errors.New("image should be non nil")
474
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
65
+
func (rm *RecordManager) AcceptImage(img *types.Image, ctx context.Context) error {
66
66
+
wasNew, err := rm.db.StoreImage(img, ctx)
67
67
+
if err != nil {
68
68
+
return err
69
69
+
}
70
70
+
if !wasNew {
71
71
+
return nil
72
72
+
}
73
73
+
err = rm.forwardImage(img, ctx)
74
74
+
if err != nil {
75
75
+
return errors.New("error forwarding image: " + err.Error())
76
76
+
}
77
77
+
return nil
78
78
+
}
79
79
+
80
80
+
func (rm *RecordManager) AcceptImageUpdate(img *types.Image, ctx context.Context) error {
81
81
+
err := rm.db.UpdateImage(img, ctx)
82
82
+
if err != nil {
83
83
+
return err
84
84
+
}
85
85
+
return nil
86
86
+
}
87
87
+
88
88
+
func (rm *RecordManager) AcceptImageDelete(img *types.Image, ctx context.Context) error {
89
89
+
err := rm.db.DeleteImage(img.URI, ctx)
90
90
+
if err != nil {
91
91
+
return err
92
92
+
}
93
93
+
return nil
94
94
+
}
95
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 {