mirror of https://github.com/sunface/rust-course
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.
136 lines
3.6 KiB
136 lines
3.6 KiB
package story
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"net/http"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/imdotdev/im.dev/server/pkg/db"
|
|
"github.com/imdotdev/im.dev/server/pkg/e"
|
|
"github.com/imdotdev/im.dev/server/pkg/models"
|
|
)
|
|
|
|
func SubmitSeriesPost(seriesID string, posts []*models.SeriesPost) *e.Error {
|
|
_, err := db.Conn.Exec("DELETE FROM series_post WHERE series_id=?", seriesID)
|
|
if err != nil {
|
|
logger.Warn("delete series post error", "error", err)
|
|
return e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
for _, post := range posts {
|
|
_, err = db.Conn.Exec("INSERT INTO series_post (series_id,post_id,priority) VALUES (?,?,?)", seriesID, post.PostID, post.Priority)
|
|
if err != nil {
|
|
logger.Warn("add series post error", "error", err)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetSeriesPost(seriesID string) ([]*models.SeriesPost, *e.Error) {
|
|
posts := make([]*models.SeriesPost, 0)
|
|
rows, err := db.Conn.Query("SELECT post_id,priority FROM series_post WHERE series_id=?", seriesID)
|
|
if err != nil {
|
|
logger.Warn("select series post error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
for rows.Next() {
|
|
post := &models.SeriesPost{}
|
|
err := rows.Scan(&post.PostID, &post.Priority)
|
|
if err != nil {
|
|
logger.Warn("scan series post error", "error", err)
|
|
continue
|
|
}
|
|
posts = append(posts, post)
|
|
}
|
|
|
|
return posts, nil
|
|
}
|
|
|
|
func GetSeriesPosts(user *models.User, seriesID string) ([]*models.Story, *e.Error) {
|
|
rows, err := db.Conn.Query("SELECT post_id,priority FROM series_post WHERE series_id=?", seriesID)
|
|
if err != nil {
|
|
logger.Warn("select series post error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
seriesPosts := make(models.SeriesPosts, 0)
|
|
seriesPostsMap := make(map[string]*models.SeriesPost)
|
|
postIDs := make([]string, 0)
|
|
|
|
for rows.Next() {
|
|
post := &models.SeriesPost{}
|
|
err := rows.Scan(&post.PostID, &post.Priority)
|
|
if err != nil {
|
|
logger.Warn("scan series post error", "error", err)
|
|
continue
|
|
}
|
|
seriesPosts = append(seriesPosts, post)
|
|
seriesPostsMap[post.PostID] = post
|
|
postIDs = append(postIDs, post.PostID)
|
|
}
|
|
|
|
ids := strings.Join(postIDs, "','")
|
|
|
|
q := fmt.Sprintf(PostQueryPrefix+"where id in ('%s')", ids)
|
|
rows, err = db.Conn.Query(q)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
logger.Warn("get user posts error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
posts := GetPosts(user, rows)
|
|
for _, post := range posts {
|
|
p, ok := seriesPostsMap[post.ID]
|
|
if ok {
|
|
post.Priority = p.Priority
|
|
}
|
|
}
|
|
|
|
sort.Sort(models.PriorityStories(posts))
|
|
return posts, nil
|
|
}
|
|
|
|
func DeleteSeriesPost(id string) *e.Error {
|
|
_, err := db.Conn.Exec("DELETE FROM series_post WHERE series_id=?", id)
|
|
if err != nil {
|
|
return e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func GetPostSeries(postID string) ([]string, *e.Error) {
|
|
series := make([]string, 0)
|
|
rows, err := db.Conn.Query("SELECT series_id FROM series_post WHERE post_id=?", postID)
|
|
if err != nil {
|
|
logger.Warn("get post series error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
for rows.Next() {
|
|
var id string
|
|
rows.Scan(&id)
|
|
series = append(series, id)
|
|
}
|
|
|
|
return series, nil
|
|
}
|
|
|
|
func GetSeries(user *models.User, seriesIds []string) ([]*models.Story, *e.Error) {
|
|
ids := strings.Join(seriesIds, "','")
|
|
q := fmt.Sprintf(PostQueryPrefix+"where id in ('%s')", ids)
|
|
rows, err := db.Conn.Query(q)
|
|
if err != nil && err != sql.ErrNoRows {
|
|
logger.Warn("get user posts error", "error", err)
|
|
return nil, e.New(http.StatusInternalServerError, e.Internal)
|
|
}
|
|
|
|
series := GetPosts(user, rows)
|
|
|
|
return series, nil
|
|
}
|