You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.1 KiB

package posts
import (
"errors"
"sort"
"strings"
"time"
"unicode/utf8"
"github.com/asaskevich/govalidator"
"github.com/gin-gonic/gin"
"github.com/imdotdev/im.dev/server/internal/session"
"github.com/imdotdev/im.dev/server/pkg/config"
"github.com/imdotdev/im.dev/server/pkg/db"
"github.com/imdotdev/im.dev/server/pkg/errcode"
"github.com/imdotdev/im.dev/server/pkg/models"
)
func UserArticles(uid int64) (models.Articles, error) {
ars := make(models.Articles, 0)
rows, err := db.Conn.Query("select id,title,url,cover,brief,created,updated from articles where creator=?", uid)
if err != nil {
return ars, err
}
creator := &models.UserSimple{ID: uid}
creator.Query()
for rows.Next() {
ar := &models.Article{}
err := rows.Scan(&ar.ID, &ar.Title, &ar.URL, &ar.Cover, &ar.Brief, &ar.Created, &ar.Updated)
if err != nil {
logger.Warn("scan articles error", "error", err)
continue
}
ar.Creator = creator
ars = append(ars, ar)
}
sort.Sort(ars)
return ars, nil
}
func PostArticle(c *gin.Context) error {
user := session.CurrentUser(c)
if !user.Role.IsEditor() {
return errors.New(errcode.NoEditorPermission)
}
ar := &models.Article{}
err := c.Bind(&ar)
if err != nil {
return err
}
if strings.TrimSpace(ar.Title) == "" || utf8.RuneCountInString(ar.Brief) > config.Data.Posts.BriefMaxLen || !govalidator.IsURL(ar.URL) || !govalidator.IsURL(ar.Cover) {
return errors.New(errcode.ParamInvalid)
}
now := time.Now()
if ar.ID == 0 {
//create
_, err = db.Conn.Exec("INSERT INTO articles (creator, title, url, cover, brief, created, updated) VALUES(?,?,?,?,?,?,?)",
user.ID, ar.Title, ar.URL, ar.Cover, ar.Brief, now, now)
return err
}
_, err = db.Conn.Exec("UPDATE articles SET title=?, url=?, cover=?, brief=?, updated=? WHERE id=?",
ar.Title, ar.URL, ar.Cover, ar.Brief, now, ar.ID)
return err
}
func DeleteArticle(c *gin.Context) error {
user := session.CurrentUser(c)
if !user.Role.IsEditor() {
return errors.New(errcode.NoEditorPermission)
}
id := c.Param("id")
_, err := db.Conn.Exec("DELETE FROM articles WHERE id=?", id)
return err
}