2024-08-11 03:51:22 +02:00
|
|
|
package svc_impls
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/repository"
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/service"
|
2024-08-22 23:03:38 +02:00
|
|
|
"github.com/lysand-org/versia-go/pkg/versia"
|
2024-08-11 03:51:22 +02:00
|
|
|
"slices"
|
|
|
|
|
|
|
|
|
|
"git.devminer.xyz/devminer/unitel"
|
|
|
|
|
"github.com/go-logr/logr"
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/api_schema"
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/entity"
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/tasks"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var _ service.NoteService = (*NoteServiceImpl)(nil)
|
|
|
|
|
|
|
|
|
|
type NoteServiceImpl struct {
|
|
|
|
|
federationService service.FederationService
|
|
|
|
|
taskService service.TaskService
|
|
|
|
|
|
|
|
|
|
repositories repository.Manager
|
|
|
|
|
|
|
|
|
|
telemetry *unitel.Telemetry
|
|
|
|
|
|
|
|
|
|
log logr.Logger
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewNoteServiceImpl(federationService service.FederationService, taskService service.TaskService, repositories repository.Manager, telemetry *unitel.Telemetry, log logr.Logger) *NoteServiceImpl {
|
|
|
|
|
return &NoteServiceImpl{
|
|
|
|
|
federationService: federationService,
|
|
|
|
|
taskService: taskService,
|
|
|
|
|
repositories: repositories,
|
|
|
|
|
telemetry: telemetry,
|
|
|
|
|
log: log,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i NoteServiceImpl) CreateNote(ctx context.Context, req api_schema.CreateNoteRequest) (*entity.Note, error) {
|
2024-08-20 22:43:26 +02:00
|
|
|
s := i.telemetry.StartSpan(ctx, "function", "svc_impls/NoteServiceImpl.CreateNote")
|
2024-08-11 03:51:22 +02:00
|
|
|
defer s.End()
|
|
|
|
|
ctx = s.Context()
|
|
|
|
|
|
|
|
|
|
var n *entity.Note
|
|
|
|
|
|
|
|
|
|
if err := i.repositories.Atomic(ctx, func(ctx context.Context, tx repository.Manager) error {
|
|
|
|
|
// FIXME: Use the user that created the note
|
|
|
|
|
author, err := tx.Users().GetLocalByID(ctx, uuid.MustParse("b6f4bcb5-ac5a-4a87-880a-c7f88f58a172"))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if author == nil {
|
|
|
|
|
return api_schema.ErrBadRequest(map[string]any{"reason": "author not found"})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mentionedUsers, err := i.repositories.Users().ResolveMultiple(ctx, req.Mentions)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if slices.ContainsFunc(mentionedUsers, func(u *entity.User) bool { return u.ID == author.ID }) {
|
|
|
|
|
return api_schema.ErrBadRequest(map[string]any{"reason": "cannot mention self"})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
n, err = tx.Notes().NewNote(ctx, author, req.Content, mentionedUsers)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := i.taskService.ScheduleTask(ctx, tasks.FederateNote, tasks.FederateNoteData{NoteID: n.ID}); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return n, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i NoteServiceImpl) GetNote(ctx context.Context, id uuid.UUID) (*entity.Note, error) {
|
2024-08-27 02:11:26 +02:00
|
|
|
s := i.telemetry.StartSpan(ctx, "function", "svc_impls/NoteServiceImpl.GetLocalUserByID")
|
2024-08-11 03:51:22 +02:00
|
|
|
defer s.End()
|
|
|
|
|
ctx = s.Context()
|
|
|
|
|
|
|
|
|
|
return i.repositories.Notes().GetByID(ctx, id)
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-27 19:59:12 +02:00
|
|
|
func (i NoteServiceImpl) ImportVersiaNote(ctx context.Context, lNote *versia.Note) (*entity.Note, error) {
|
|
|
|
|
s := i.telemetry.StartSpan(ctx, "function", "svc_impls/NoteServiceImpl.ImportVersiaNote")
|
2024-08-11 03:51:22 +02:00
|
|
|
defer s.End()
|
|
|
|
|
ctx = s.Context()
|
|
|
|
|
|
2024-08-27 19:59:12 +02:00
|
|
|
return i.repositories.Notes().ImportVersiaNote(ctx, lNote)
|
2024-08-11 03:51:22 +02:00
|
|
|
}
|