mirror of
https://github.com/fiatjaf/khatru.git
synced 2025-03-26 01:31:46 +01:00
105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
package blossom
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"github.com/fiatjaf/eventstore"
|
|
"github.com/nbd-wtf/go-nostr"
|
|
)
|
|
|
|
// EventStoreBlobIndexWrapper uses fake events to keep track of what blobs we have stored and who owns them
|
|
type EventStoreBlobIndexWrapper struct {
|
|
eventstore.Store
|
|
|
|
ServiceURL string
|
|
}
|
|
|
|
func (es EventStoreBlobIndexWrapper) Keep(ctx context.Context, blob BlobDescriptor, pubkey string) error {
|
|
ch, err := es.Store.QueryEvents(ctx, nostr.Filter{Authors: []string{pubkey}, Kinds: []int{24242}, Tags: nostr.TagMap{"x": []string{blob.SHA256}}})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if <-ch == nil {
|
|
// doesn't exist, save
|
|
evt := &nostr.Event{
|
|
PubKey: pubkey,
|
|
Kind: 24242,
|
|
Tags: nostr.Tags{
|
|
{"x", blob.SHA256},
|
|
{"type", blob.Type},
|
|
{"size", strconv.Itoa(blob.Size)},
|
|
},
|
|
CreatedAt: blob.Uploaded,
|
|
}
|
|
evt.ID = evt.GetID()
|
|
es.Store.SaveEvent(ctx, evt)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (es EventStoreBlobIndexWrapper) List(ctx context.Context, pubkey string) (chan BlobDescriptor, error) {
|
|
ech, err := es.Store.QueryEvents(ctx, nostr.Filter{Authors: []string{pubkey}, Kinds: []int{24242}})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ch := make(chan BlobDescriptor)
|
|
|
|
go func() {
|
|
for evt := range ech {
|
|
ch <- es.parseEvent(evt)
|
|
}
|
|
close(ch)
|
|
}()
|
|
|
|
return ch, nil
|
|
}
|
|
|
|
func (es EventStoreBlobIndexWrapper) Get(ctx context.Context, sha256 string) (*BlobDescriptor, error) {
|
|
ech, err := es.Store.QueryEvents(ctx, nostr.Filter{Tags: nostr.TagMap{"x": []string{sha256}}, Kinds: []int{24242}, Limit: 1})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
evt := <-ech
|
|
if evt != nil {
|
|
bd := es.parseEvent(evt)
|
|
return &bd, nil
|
|
}
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
func (es EventStoreBlobIndexWrapper) Delete(ctx context.Context, sha256 string, pubkey string) error {
|
|
ech, err := es.Store.QueryEvents(ctx, nostr.Filter{Authors: []string{pubkey}, Tags: nostr.TagMap{"x": []string{sha256}}, Kinds: []int{24242}, Limit: 1})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
evt := <-ech
|
|
if evt != nil {
|
|
return es.Store.DeleteEvent(ctx, evt)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (es EventStoreBlobIndexWrapper) parseEvent(evt *nostr.Event) BlobDescriptor {
|
|
hhash := evt.Tags[0][1]
|
|
mimetype := evt.Tags[1][1]
|
|
ext := getExtension(mimetype)
|
|
size, _ := strconv.Atoi(evt.Tags[2][1])
|
|
|
|
return BlobDescriptor{
|
|
Owner: evt.PubKey,
|
|
Uploaded: evt.CreatedAt,
|
|
URL: es.ServiceURL + "/" + hhash + ext,
|
|
SHA256: hhash,
|
|
Type: mimetype,
|
|
Size: size,
|
|
}
|
|
}
|