Remove search engine, add event list api
All checks were successful
Client CMS Check Build (NixCN CMS) TeamCity build finished
Backend Check Build (NixCN CMS) TeamCity build finished

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2026-01-30 11:54:13 +08:00
parent 2aa344a11f
commit 39f555b780
26 changed files with 401 additions and 499 deletions

View File

@@ -3,9 +3,7 @@ package data
import (
"context"
"github.com/go-viper/mapstructure/v2"
"github.com/google/uuid"
"github.com/meilisearch/meilisearch-go"
"gorm.io/gorm"
)
@@ -23,7 +21,7 @@ type User struct {
AllowPublic bool `json:"allow_public" gorm:"default:false;not null"`
}
type UserSearchDoc struct {
type UserIndexDoc struct {
UserId string `json:"user_id"`
Email string `json:"email"`
Username string `json:"username"`
@@ -118,12 +116,6 @@ func (self *User) Create(ctx context.Context) error {
return err
}
// Search index (eventual consistency)
if err := self.UpdateSearchIndex(&ctx); err != nil {
// TODO: async retry / log
return err
}
return nil
}
@@ -139,8 +131,7 @@ func (self *User) UpdateByUserID(ctx context.Context, userId *uuid.UUID, updates
if err := tx.Where("user_id = ?", userId).First(&updatedUser).Error; err != nil {
return err
}
return updatedUser.UpdateSearchIndex(&ctx)
return nil
})
}
@@ -153,55 +144,19 @@ func (self *User) GetFullTable(ctx context.Context) (*[]User, error) {
return &users, nil
}
func (self *User) FastListUsers(ctx context.Context, limit, offset *int64) (*[]UserSearchDoc, error) {
index := MeiliSearch.Index("user")
func (self *User) FastListUsers(ctx context.Context, limit, offset *int) (*[]UserIndexDoc, error) {
var results []UserIndexDoc
query := Database.WithContext(ctx).Model(&User{})
err := query.Select("user_id", "email", "username", "nickname", "subtitle", "avatar").
Limit(*limit).
Offset(*offset).
Scan(&results).Error
// Fast read from MeiliSearch, no DB involved
result, err := index.SearchWithContext(ctx, "", &meilisearch.SearchRequest{
Limit: *limit,
Offset: *offset,
})
if err != nil {
return nil, err
}
var list []UserSearchDoc
if err := mapstructure.Decode(result.Hits, &list); err != nil {
return nil, err
}
return &list, nil
}
func (self *User) UpdateSearchIndex(ctx *context.Context) error {
doc := UserSearchDoc{
UserId: self.UserId.String(),
Email: self.Email,
Username: self.Username,
Nickname: self.Nickname,
Subtitle: self.Subtitle,
Avatar: self.Avatar,
}
index := MeiliSearch.Index("user")
primaryKey := "user_id"
opts := &meilisearch.DocumentOptions{
PrimaryKey: &primaryKey,
}
if _, err := index.UpdateDocumentsWithContext(
*ctx,
[]UserSearchDoc{doc},
opts,
); err != nil {
return err
}
return nil
}
func (self *User) DeleteSearchIndex(ctx *context.Context) error {
index := MeiliSearch.Index("user")
_, err := index.DeleteDocumentWithContext(*ctx, self.UserId.String(), nil)
return err
return &results, nil
}