Compare commits

..

No commits in common. "d4dfa810d1152cc0d67bba21286acaa72247badd" and "045744aa18aea252dea941c8d1be9e076cfc2b0c" have entirely different histories.

5 changed files with 66 additions and 83 deletions

View File

@ -28,9 +28,8 @@ type Post struct {
RepostTo *Post `json:"repost_to" gorm:"foreignKey:RepostID"` RepostTo *Post `json:"repost_to" gorm:"foreignKey:RepostID"`
Realm *Realm `json:"realm"` Realm *Realm `json:"realm"`
IsDraft bool `json:"is_draft"` IsDraft bool `json:"is_draft"`
PublishedAt *time.Time `json:"published_at"` PublishedAt *time.Time `json:"published_at"`
PublishedUntil *time.Time `json:"published_until"`
AuthorID uint `json:"author_id"` AuthorID uint `json:"author_id"`
Author Account `json:"author"` Author Account `json:"author"`

View File

@ -19,16 +19,15 @@ func createArticle(c *fiber.Ctx) error {
user := c.Locals("user").(models.Account) user := c.Locals("user").(models.Account)
var data struct { var data struct {
Title string `json:"title" validate:"required,max=1024"` Title string `json:"title" validate:"required,max=1024"`
Description *string `json:"description" validate:"max=2048"` Description *string `json:"description" validate:"max=2048"`
Content string `json:"content" validate:"required"` Content string `json:"content" validate:"required"`
Attachments []uint `json:"attachments"` Attachments []uint `json:"attachments"`
Tags []models.Tag `json:"tags"` PublishedAt *time.Time `json:"published_at"`
Categories []models.Category `json:"categories"` IsDraft bool `json:"is_draft"`
PublishedAt *time.Time `json:"published_at"` RealmAlias *string `json:"realm"`
PublishedUntil *time.Time `json:"published_until"` Tags []models.Tag `json:"tags"`
IsDraft bool `json:"is_draft"` Categories []models.Category `json:"categories"`
RealmAlias *string `json:"realm"`
} }
if err := exts.BindAndValidate(c, &data); err != nil { if err := exts.BindAndValidate(c, &data); err != nil {
@ -47,15 +46,13 @@ func createArticle(c *fiber.Ctx) error {
_ = jsoniter.Unmarshal(rawBody, &bodyMapping) _ = jsoniter.Unmarshal(rawBody, &bodyMapping)
item := models.Post{ item := models.Post{
Type: models.PostTypeArticle, Type: models.PostTypeArticle,
Body: bodyMapping, Body: bodyMapping,
Language: services.DetectLanguage(data.Content), Tags: data.Tags,
Tags: data.Tags, Categories: data.Categories,
Categories: data.Categories, IsDraft: data.IsDraft,
IsDraft: data.IsDraft, PublishedAt: data.PublishedAt,
PublishedAt: data.PublishedAt, AuthorID: user.ID,
PublishedUntil: data.PublishedUntil,
AuthorID: user.ID,
} }
if data.RealmAlias != nil { if data.RealmAlias != nil {
@ -84,15 +81,14 @@ func editArticle(c *fiber.Ctx) error {
user := c.Locals("user").(models.Account) user := c.Locals("user").(models.Account)
var data struct { var data struct {
Title string `json:"title" validate:"required,max=1024"` Title string `json:"title" validate:"required,max=1024"`
Description *string `json:"description" validate:"max=2048"` Description *string `json:"description" validate:"max=2048"`
Content string `json:"content" validate:"required"` Content string `json:"content" validate:"required"`
Attachments []uint `json:"attachments"` Attachments []uint `json:"attachments"`
Tags []models.Tag `json:"tags"` IsDraft bool `json:"is_draft"`
Categories []models.Category `json:"categories"` PublishedAt *time.Time `json:"published_at"`
IsDraft bool `json:"is_draft"` Tags []models.Tag `json:"tags"`
PublishedAt *time.Time `json:"published_at"` Categories []models.Category `json:"categories"`
PublishedUntil *time.Time `json:"published_until"`
} }
if err := exts.BindAndValidate(c, &data); err != nil { if err := exts.BindAndValidate(c, &data); err != nil {
@ -118,12 +114,10 @@ func editArticle(c *fiber.Ctx) error {
_ = jsoniter.Unmarshal(rawBody, &bodyMapping) _ = jsoniter.Unmarshal(rawBody, &bodyMapping)
item.Body = bodyMapping item.Body = bodyMapping
item.Language = services.DetectLanguage(data.Content)
item.Tags = data.Tags
item.Categories = data.Categories
item.IsDraft = data.IsDraft item.IsDraft = data.IsDraft
item.PublishedAt = data.PublishedAt item.PublishedAt = data.PublishedAt
item.PublishedUntil = data.PublishedUntil item.Tags = data.Tags
item.Categories = data.Categories
if item, err := services.EditPost(item); err != nil { if item, err := services.EditPost(item); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error()) return fiber.NewError(fiber.StatusBadRequest, err.Error())

View File

@ -19,18 +19,17 @@ func createStory(c *fiber.Ctx) error {
user := c.Locals("user").(models.Account) user := c.Locals("user").(models.Account)
var data struct { var data struct {
Title *string `json:"title" validate:"max=1024"` Title *string `json:"title" validate:"max=1024"`
Content string `json:"content" validate:"required,max=4096"` Content string `json:"content" validate:"required,max=4096"`
Location *string `json:"location" validate:"max=2048"` Location *string `json:"location" validate:"max=2048"`
Attachments []uint `json:"attachments"` Attachments []uint `json:"attachments"`
Tags []models.Tag `json:"tags"` Tags []models.Tag `json:"tags"`
Categories []models.Category `json:"categories"` Categories []models.Category `json:"categories"`
PublishedAt *time.Time `json:"published_at"` PublishedAt *time.Time `json:"published_at"`
PublishedUntil *time.Time `json:"published_until"` IsDraft bool `json:"is_draft"`
IsDraft bool `json:"is_draft"` RealmAlias *string `json:"realm"`
RealmAlias *string `json:"realm"` ReplyTo *uint `json:"reply_to"`
ReplyTo *uint `json:"reply_to"` RepostTo *uint `json:"repost_to"`
RepostTo *uint `json:"repost_to"`
} }
if err := exts.BindAndValidate(c, &data); err != nil { if err := exts.BindAndValidate(c, &data); err != nil {
@ -49,15 +48,13 @@ func createStory(c *fiber.Ctx) error {
_ = jsoniter.Unmarshal(rawBody, &bodyMapping) _ = jsoniter.Unmarshal(rawBody, &bodyMapping)
item := models.Post{ item := models.Post{
Type: models.PostTypeStory, Type: models.PostTypeStory,
Body: bodyMapping, Body: bodyMapping,
Language: services.DetectLanguage(data.Content), Tags: data.Tags,
Tags: data.Tags, Categories: data.Categories,
Categories: data.Categories, IsDraft: data.IsDraft,
PublishedAt: data.PublishedAt, PublishedAt: data.PublishedAt,
PublishedUntil: data.PublishedUntil, AuthorID: user.ID,
IsDraft: data.IsDraft,
AuthorID: user.ID,
} }
if data.ReplyTo != nil { if data.ReplyTo != nil {
@ -103,15 +100,14 @@ func editStory(c *fiber.Ctx) error {
user := c.Locals("user").(models.Account) user := c.Locals("user").(models.Account)
var data struct { var data struct {
Title *string `json:"title" validate:"max=1024"` Title *string `json:"title" validate:"max=1024"`
Content string `json:"content" validate:"required,max=4096"` Content string `json:"content" validate:"required,max=4096"`
Location *string `json:"location" validate:"max=2048"` Location *string `json:"location" validate:"max=2048"`
Attachments []uint `json:"attachments"` Attachments []uint `json:"attachments"`
Tags []models.Tag `json:"tags"` IsDraft bool `json:"is_draft"`
Categories []models.Category `json:"categories"` PublishedAt *time.Time `json:"published_at"`
PublishedAt *time.Time `json:"published_at"` Tags []models.Tag `json:"tags"`
PublishedUntil *time.Time `json:"published_until"` Categories []models.Category `json:"categories"`
IsDraft bool `json:"is_draft"`
} }
if err := exts.BindAndValidate(c, &data); err != nil { if err := exts.BindAndValidate(c, &data); err != nil {
@ -138,12 +134,10 @@ func editStory(c *fiber.Ctx) error {
_ = jsoniter.Unmarshal(rawBody, &bodyMapping) _ = jsoniter.Unmarshal(rawBody, &bodyMapping)
item.Body = bodyMapping item.Body = bodyMapping
item.Language = services.DetectLanguage(data.Content) item.IsDraft = data.IsDraft
item.PublishedAt = data.PublishedAt
item.Tags = data.Tags item.Tags = data.Tags
item.Categories = data.Categories item.Categories = data.Categories
item.PublishedAt = data.PublishedAt
item.PublishedUntil = data.PublishedUntil
item.IsDraft = data.IsDraft
if item, err := services.EditPost(item); err != nil { if item, err := services.EditPost(item); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error()) return fiber.NewError(fiber.StatusBadRequest, err.Error())

View File

@ -5,12 +5,14 @@ import (
"strings" "strings"
) )
func DetectLanguage(content string) string { func DetectLanguage(content *string) string {
detector := lingua.NewLanguageDetectorBuilder(). if content != nil {
FromLanguages(lingua.AllLanguages()...). detector := lingua.NewLanguageDetectorBuilder().
Build() FromLanguages(lingua.AllLanguages()...).
if lang, ok := detector.DetectLanguageOf(content); ok { Build()
return strings.ToLower(lang.String()) if lang, ok := detector.DetectLanguageOf(*content); ok {
return strings.ToLower(lang.String())
}
} }
return "unknown" return "unknown"
} }

View File

@ -44,9 +44,7 @@ func FilterPostReply(tx *gorm.DB, replyTo ...uint) *gorm.DB {
} }
func FilterPostWithPublishedAt(tx *gorm.DB, date time.Time) *gorm.DB { func FilterPostWithPublishedAt(tx *gorm.DB, date time.Time) *gorm.DB {
return tx. return tx.Where("published_at <= ? OR published_at IS NULL", date)
Where("published_at <= ? OR published_at IS NULL", date).
Where("published_until > ? OR published_until IS NULL", date)
} }
func FilterPostWithAuthorDraft(tx *gorm.DB, uid uint) *gorm.DB { func FilterPostWithAuthorDraft(tx *gorm.DB, uid uint) *gorm.DB {
@ -123,7 +121,7 @@ func ListPost(tx *gorm.DB, take int, offset int, noReact ...bool) ([]*models.Pos
var items []*models.Post var items []*models.Post
if err := tx. if err := tx.
Limit(take).Offset(offset). Limit(take).Offset(offset).
Order("published_at DESC"). Order("created_at DESC").
Preload("Tags"). Preload("Tags").
Preload("Categories"). Preload("Categories").
Preload("Realm"). Preload("Realm").
@ -218,10 +216,6 @@ func EnsurePostCategoriesAndTags(item models.Post) (models.Post, error) {
} }
func NewPost(user models.Account, item models.Post) (models.Post, error) { func NewPost(user models.Account, item models.Post) (models.Post, error) {
if !item.IsDraft && item.PublishedAt == nil {
item.PublishedAt = lo.ToPtr(time.Now())
}
item, err := EnsurePostCategoriesAndTags(item) item, err := EnsurePostCategoriesAndTags(item)
if err != nil { if err != nil {
return item, err return item, err