mirror of
https://github.com/versia-pub/versia-go.git
synced 2025-12-06 14:28:20 +01:00
118 lines
2.9 KiB
Go
118 lines
2.9 KiB
Go
package repo_impls
|
|
|
|
import (
|
|
"context"
|
|
"github.com/lysand-org/versia-go/internal/repository"
|
|
"github.com/lysand-org/versia-go/pkg/versia"
|
|
|
|
"git.devminer.xyz/devminer/unitel"
|
|
"github.com/go-logr/logr"
|
|
"github.com/google/uuid"
|
|
"github.com/lysand-org/versia-go/ent"
|
|
"github.com/lysand-org/versia-go/ent/note"
|
|
"github.com/lysand-org/versia-go/internal/entity"
|
|
"github.com/lysand-org/versia-go/internal/utils"
|
|
)
|
|
|
|
var _ repository.NoteRepository = (*NoteRepositoryImpl)(nil)
|
|
|
|
type NoteRepositoryImpl struct {
|
|
db *ent.Client
|
|
log logr.Logger
|
|
telemetry *unitel.Telemetry
|
|
}
|
|
|
|
func NewNoteRepositoryImpl(db *ent.Client, log logr.Logger, telemetry *unitel.Telemetry) repository.NoteRepository {
|
|
return &NoteRepositoryImpl{
|
|
db: db,
|
|
log: log,
|
|
telemetry: telemetry,
|
|
}
|
|
}
|
|
|
|
func (i *NoteRepositoryImpl) NewNote(ctx context.Context, author *entity.User, content string, mentions []*entity.User) (*entity.Note, error) {
|
|
s := i.telemetry.StartSpan(ctx, "function", "repo_impls/NoteRepositoryImpl.NewNote")
|
|
defer s.End()
|
|
ctx = s.Context()
|
|
|
|
nid := uuid.New()
|
|
|
|
n, err := i.db.Note.Create().
|
|
SetID(nid).
|
|
SetIsRemote(false).
|
|
SetURI(utils.NoteAPIURL(nid).String()).
|
|
SetAuthor(author.User).
|
|
SetContent(content).
|
|
AddMentions(utils.MapSlice(mentions, func(m *entity.User) *ent.User { return m.User })...).
|
|
Save(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
n, err = i.db.Note.Query().
|
|
Where(note.ID(nid)).
|
|
WithAuthor().
|
|
WithMentions().
|
|
Only(ctx)
|
|
if err != nil {
|
|
i.log.Error(err, "Failed to query author", "id", nid)
|
|
return nil, err
|
|
}
|
|
|
|
return entity.NewNote(n)
|
|
}
|
|
|
|
func (i *NoteRepositoryImpl) ImportLysandNote(ctx context.Context, lNote *versia.Note) (*entity.Note, error) {
|
|
s := i.telemetry.StartSpan(ctx, "function", "repo_impls/NoteRepositoryImpl.ImportLysandNote")
|
|
defer s.End()
|
|
ctx = s.Context()
|
|
|
|
id, err := i.db.Note.Create().
|
|
SetID(uuid.New()).
|
|
SetIsRemote(true).
|
|
SetURI(lNote.URI.String()).
|
|
OnConflict().
|
|
UpdateNewValues().
|
|
ID(ctx)
|
|
if err != nil {
|
|
i.log.Error(err, "Failed to import note into database", "uri", lNote.URI)
|
|
return nil, err
|
|
}
|
|
|
|
n, err := i.db.Note.Get(ctx, id)
|
|
if err != nil {
|
|
i.log.Error(err, "Failed to get imported note", "id", id, "uri", lNote.URI)
|
|
return nil, err
|
|
}
|
|
|
|
i.log.V(2).Info("Imported note into database", "id", id, "uri", lNote.URI)
|
|
|
|
return entity.NewNote(n)
|
|
}
|
|
|
|
func (i *NoteRepositoryImpl) GetByID(ctx context.Context, id uuid.UUID) (*entity.Note, error) {
|
|
s := i.telemetry.StartSpan(ctx, "function", "repo_impls/NoteRepositoryImpl.LookupByIDOrUsername")
|
|
defer s.End()
|
|
ctx = s.Context()
|
|
|
|
n, err := i.db.Note.Query().
|
|
Where(note.ID(id)).
|
|
WithAuthor().
|
|
WithMentions().
|
|
Only(ctx)
|
|
if err != nil {
|
|
if !ent.IsNotFound(err) {
|
|
i.log.Error(err, "Failed to query user", "id", id)
|
|
return nil, err
|
|
}
|
|
|
|
i.log.V(2).Info("User not found in DB", "id", id)
|
|
|
|
return nil, nil
|
|
}
|
|
|
|
i.log.V(2).Info("User found in DB", "id", id)
|
|
|
|
return entity.NewNote(n)
|
|
}
|