versia-go/internal/repository/repo_impls/note_repository_impl.go
2024-08-13 01:18:14 +02:00

118 lines
2.9 KiB
Go

package repo_impls
import (
"context"
"github.com/lysand-org/versia-go/internal/repository"
"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"
"github.com/lysand-org/versia-go/pkg/lysand"
)
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", "repository/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 *lysand.Note) (*entity.Note, error) {
s := i.telemetry.StartSpan(ctx, "function", "repository/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", "repository/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)
}