Work on getting notes API
This commit is contained in:
parent
f656757710
commit
8a4c19dd17
9 changed files with 153 additions and 11 deletions
|
@ -66,7 +66,7 @@ func linstromGetAccount(w http.ResponseWriter, r *http.Request) {
|
||||||
Msg("Failed to convert storage account (and attached data) into linstrom API representation")
|
Msg("Failed to convert storage account (and attached data) into linstrom API representation")
|
||||||
other.HttpErr(
|
other.HttpErr(
|
||||||
w,
|
w,
|
||||||
HttpErrIdConverionFailure,
|
HttpErrIdConversionFailure,
|
||||||
"Failed to convert storage account and attached data into API representation",
|
"Failed to convert storage account and attached data into API representation",
|
||||||
http.StatusInternalServerError,
|
http.StatusInternalServerError,
|
||||||
)
|
)
|
||||||
|
@ -154,7 +154,7 @@ func linstromUpdateAccount(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Error().Err(err).Msg("Failed to convert updated account back into api form")
|
log.Error().Err(err).Msg("Failed to convert updated account back into api form")
|
||||||
other.HttpErr(
|
other.HttpErr(
|
||||||
w,
|
w,
|
||||||
HttpErrIdConverionFailure,
|
HttpErrIdConversionFailure,
|
||||||
"Failed to convert updated account back into api form",
|
"Failed to convert updated account back into api form",
|
||||||
http.StatusInternalServerError,
|
http.StatusInternalServerError,
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,16 +2,61 @@ package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/google/jsonapi"
|
||||||
|
"github.com/rs/zerolog/hlog"
|
||||||
|
"gitlab.com/mstarongitlab/goutils/other"
|
||||||
|
"gitlab.com/mstarongitlab/linstrom/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Notes
|
// Notes
|
||||||
func linstromGetNote(w http.ResponseWriter, r *http.Request) {
|
func linstromGetNote(w http.ResponseWriter, r *http.Request) {
|
||||||
store := StorageFromRequest(r)
|
store := StorageFromRequest(r)
|
||||||
noteId := NoteIdFromRequest(r)
|
noteId := NoteIdFromRequest(r)
|
||||||
note, err := store.FindNoteById(noteId)
|
log := hlog.FromRequest(r)
|
||||||
_ = note
|
sNote, err := store.FindNoteById(noteId)
|
||||||
_ = err
|
switch err {
|
||||||
|
case nil:
|
||||||
|
// Found, progress past switch statement
|
||||||
|
case storage.ErrEntryNotFound:
|
||||||
|
other.HttpErr(w, HttpErrIdNotFound, "Note not found", http.StatusNotFound)
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
log.Error().Err(err).Str("note-id", noteId).Msg("Failed to get note from db")
|
||||||
|
other.HttpErr(
|
||||||
|
w,
|
||||||
|
HttpErrIdDbFailure,
|
||||||
|
"Failed to get note from db",
|
||||||
|
http.StatusInternalServerError,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
note, err := convertNoteStorageToLinstrom(sNote, store)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().
|
||||||
|
Err(err).
|
||||||
|
Str("note-id", noteId).
|
||||||
|
Msg("Failed to convert note into linstrom api form")
|
||||||
|
other.HttpErr(
|
||||||
|
w,
|
||||||
|
HttpErrIdConversionFailure,
|
||||||
|
"Failed to convert note",
|
||||||
|
http.StatusInternalServerError,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
err = jsonapi.MarshalPayload(w, note)
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Any("note", note).Msg("Failed to marshal and send note")
|
||||||
|
other.HttpErr(
|
||||||
|
w,
|
||||||
|
HttpErrIdJsonMarshalFail,
|
||||||
|
"Failed to convert note",
|
||||||
|
http.StatusInternalServerError,
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func linstromUpdateNote(w http.ResponseWriter, r *http.Request) {}
|
func linstromUpdateNote(w http.ResponseWriter, r *http.Request) {}
|
||||||
func linstromNewNote(w http.ResponseWriter, r *http.Request) {}
|
func linstromNewNote(w http.ResponseWriter, r *http.Request) {}
|
||||||
func linstromDeleteNote(w http.ResponseWriter, r *http.Request) {}
|
func linstromDeleteNote(w http.ResponseWriter, r *http.Request) {}
|
||||||
|
|
|
@ -125,3 +125,60 @@ func convertInfoFieldStorageToLinstrom(field storage.UserInfoField) *linstromCus
|
||||||
BelongsToId: field.BelongsTo,
|
BelongsToId: field.BelongsTo,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertNoteStorageToLinstrom(
|
||||||
|
note *storage.Note,
|
||||||
|
store *storage.Storage,
|
||||||
|
) (*linstromNote, error) {
|
||||||
|
panic("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertEmoteStorageToLinstrom(
|
||||||
|
emote *storage.Emote,
|
||||||
|
store *storage.Storage,
|
||||||
|
) (*linstromEmote, error) {
|
||||||
|
storageServer, err := store.FindRemoteServerById(emote.ServerId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("server: %w", err)
|
||||||
|
}
|
||||||
|
server, err := convertServerStorageToLinstrom(storageServer, store)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("server conversion: %w", err)
|
||||||
|
}
|
||||||
|
storageMedia, err := store.GetMediaMetadataById(emote.MetadataId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("media metadata: %w", err)
|
||||||
|
}
|
||||||
|
media := convertMediaMetadataStorageToLinstrom(storageMedia)
|
||||||
|
|
||||||
|
return &linstromEmote{
|
||||||
|
Id: emote.ID,
|
||||||
|
MetadataId: emote.MetadataId,
|
||||||
|
Metadata: media,
|
||||||
|
Name: emote.Name,
|
||||||
|
ServerId: emote.ServerId,
|
||||||
|
Server: server,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convertReactionStorageToLinstrom(
|
||||||
|
reaction *storage.Reaction,
|
||||||
|
store *storage.Storage,
|
||||||
|
) (*linstromReaction, error) {
|
||||||
|
storageEmote, err := store.GetEmoteById(reaction.EmoteId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("emote: %w", err)
|
||||||
|
}
|
||||||
|
emote, err := convertEmoteStorageToLinstrom(storageEmote, store)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("emote conversion: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &linstromReaction{
|
||||||
|
Id: reaction.ID,
|
||||||
|
NoteId: reaction.NoteId,
|
||||||
|
ReactorId: reaction.ReactorId,
|
||||||
|
EmoteId: reaction.EmoteId,
|
||||||
|
Emote: emote,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ package server
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ = linstromNote{}
|
|
||||||
_ = linstromRole{}
|
_ = linstromRole{}
|
||||||
_ = linstromRelation{}
|
_ = linstromRelation{}
|
||||||
)
|
)
|
||||||
|
@ -29,6 +28,7 @@ type linstromNote struct {
|
||||||
AccessLevel uint8 `jsonapi:"attr,access-level"`
|
AccessLevel uint8 `jsonapi:"attr,access-level"`
|
||||||
Pings []*linstromAccount `jsonapi:"relation,pings,omitempty"`
|
Pings []*linstromAccount `jsonapi:"relation,pings,omitempty"`
|
||||||
PingIds []string `jsonapi:"attr,ping-ids,omitempty"`
|
PingIds []string `jsonapi:"attr,ping-ids,omitempty"`
|
||||||
|
ReactionIds []uint `jsonapi:"attr,reaction-ids"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type linstromOriginServer struct {
|
type linstromOriginServer struct {
|
||||||
|
@ -100,6 +100,23 @@ type linstromRelation struct {
|
||||||
Accepted bool `jsonapi:"attr,accepted"`
|
Accepted bool `jsonapi:"attr,accepted"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type linstromReaction struct {
|
||||||
|
Id uint `jsonapi:"primary,reactions"`
|
||||||
|
NoteId string `jsonapi:"attr,note-id"`
|
||||||
|
ReactorId string `jsonapi:"attr,reactor-id"`
|
||||||
|
EmoteId uint `jsonapi:"attr,emote-id"`
|
||||||
|
Emote *linstromEmote `jsonapi:"relation,emote"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type linstromEmote struct {
|
||||||
|
Id uint `jsonapi:"primary,emotes"`
|
||||||
|
MetadataId string `jsonapi:"attr,metadata-id"`
|
||||||
|
Metadata *linstromMediaMetadata `jsonapi:"relation,metadata"`
|
||||||
|
Name string `jsonapi:"attr,name"`
|
||||||
|
ServerId uint `jsonapi:"attr,server-id"`
|
||||||
|
Server *linstromOriginServer `jsonapi:"relation,server"`
|
||||||
|
}
|
||||||
|
|
||||||
// Role is essentially just a carbon copy of storage/roles.go
|
// Role is essentially just a carbon copy of storage/roles.go
|
||||||
type linstromRole struct {
|
type linstromRole struct {
|
||||||
Id uint `jsonapi:"primary,roles"`
|
Id uint `jsonapi:"primary,roles"`
|
||||||
|
|
|
@ -18,5 +18,5 @@ const (
|
||||||
HttpErrIdBadRequest
|
HttpErrIdBadRequest
|
||||||
HttpErrIdAlreadyExists
|
HttpErrIdAlreadyExists
|
||||||
HttpErrIdNotFound
|
HttpErrIdNotFound
|
||||||
HttpErrIdConverionFailure
|
HttpErrIdConversionFailure
|
||||||
)
|
)
|
||||||
|
|
|
@ -78,7 +78,7 @@ func buildRootHandler(
|
||||||
)
|
)
|
||||||
|
|
||||||
mux.HandleFunc("/placeholder-file", func(w http.ResponseWriter, r *http.Request) {
|
mux.HandleFunc("/placeholder-file", func(w http.ResponseWriter, r *http.Request) {
|
||||||
fmt.Fprint(w, placeholderFile)
|
fmt.Fprint(w, *placeholderFile)
|
||||||
})
|
})
|
||||||
|
|
||||||
return mux
|
return mux
|
||||||
|
|
|
@ -8,5 +8,18 @@ type Emote struct {
|
||||||
MetadataId string
|
MetadataId string
|
||||||
Name string
|
Name string
|
||||||
// Server RemoteServer // `gorm:"foreignKey:ServerId;references:ID"`
|
// Server RemoteServer // `gorm:"foreignKey:ServerId;references:ID"`
|
||||||
ServerId string
|
ServerId uint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Storage) GetEmoteById(id uint) (*Emote, error) {
|
||||||
|
out := Emote{}
|
||||||
|
err := s.db.First(&out, id).Error
|
||||||
|
switch err {
|
||||||
|
case nil:
|
||||||
|
return &out, nil
|
||||||
|
case gorm.ErrRecordNotFound:
|
||||||
|
return nil, ErrEntryNotFound
|
||||||
|
default:
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
10
storage/reactions.go
Normal file
10
storage/reactions.go
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import "gorm.io/gorm"
|
||||||
|
|
||||||
|
type Reaction struct {
|
||||||
|
gorm.Model
|
||||||
|
NoteId string
|
||||||
|
ReactorId string
|
||||||
|
EmoteId uint
|
||||||
|
}
|
|
@ -168,8 +168,8 @@ func (s *Storage) FindAccountById(id string) (*Account, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debug().Str("account-id", id).Msg("Didn't hit account in cache, checking db")
|
log.Debug().Str("account-id", id).Msg("Didn't hit account in cache, checking db")
|
||||||
acc = &Account{ID: id}
|
acc = &Account{}
|
||||||
res := s.db.First(acc)
|
res := s.db.Where(Account{ID: id}).First(acc)
|
||||||
if res.Error != nil {
|
if res.Error != nil {
|
||||||
if errors.Is(res.Error, gorm.ErrRecordNotFound) {
|
if errors.Is(res.Error, gorm.ErrRecordNotFound) {
|
||||||
log.Warn().Str("account-id", id).Msg("Account not found")
|
log.Warn().Str("account-id", id).Msg("Account not found")
|
||||||
|
|
Loading…
Reference in a new issue