Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- func AddPosts(posts *[]models.Post, slugOrId string) (*[]models.Post, error) {
- newPosts := &[]models.Post{}
- curThread := &models.Thread{}
- if id, err := strconv.Atoi(slugOrId); err != nil {
- curThread = FindThreadBySlug(slugOrId)
- } else {
- curThread = FindThreadById(id)
- }
- if curThread == nil {
- return nil, &NotFound{"Thread", slugOrId}
- }
- if len(*posts) == 0 {
- return newPosts, nil
- }
- now := time.Now()
- stmtForumUser, err := db.Prepare("INSERT INTO forum_users (nickname, forum) " +
- "VALUES ($1, $2) " +
- "ON CONFLICT (nickname, forum) DO NOTHING")
- if err != nil {
- return nil, err
- }
- defer stmtForumUser.Close()
- tx, err := db.Begin()
- if err != nil {
- return nil, err
- }
- defer tx.Rollback()
- stmt, err := tx.Prepare("INSERT INTO post (post_author, post_created, post_forum, post_id, post_message, parent, post_thread, path, founder) " +
- "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING post_id, post_created")
- if err != nil {
- return nil, err
- }
- defer stmt.Close()
- stmtUser, err := tx.Prepare("SELECT nickname FROM user_profile WHERE nickname = $1")
- if err != nil {
- return nil, err
- }
- defer stmtUser.Close()
- stmtId, err := tx.Prepare("SELECT nextval(pg_get_serial_sequence('post', 'post_id'))")
- if err != nil {
- return nil, err
- }
- defer stmtId.Close()
- stmtPost, err := tx.Prepare("SELECT post_thread, path FROM post WHERE post_id = $1")
- if err != nil {
- return nil, err
- }
- defer stmtPost.Close()
- for key, value := range *posts {
- err = stmtUser.QueryRow(value.Post_author).Scan(&(*posts)[key].Post_author)
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, &NotFound{"User", value.Post_author}
- }
- return nil, err
- }
- (*posts)[key].Post_thread = curThread.Thread_id
- (*posts)[key].Post_forum = curThread.Thread_forum
- if value.Parent != 0 {
- parent := models.Post{}
- err = stmtPost.QueryRow(value.Parent).Scan(&parent.Post_thread, pq.Array(&parent.Path))
- if err != nil {
- if err == sql.ErrNoRows {
- return nil, ErrParentPost
- }
- return nil, err
- }
- if parent.Post_thread != curThread.Thread_id {
- return nil, ErrParentPost
- }
- (*posts)[key].Path = parent.Path
- }
- err := stmtId.QueryRow().Scan(&(*posts)[key].Post_id)
- if err != nil {
- return nil, err
- }
- (*posts)[key].Path = append((*posts)[key].Path, int64((*posts)[key].Post_id))
- (*posts)[key].Founder = int((*posts)[key].Path[0])
- err = stmt.QueryRow(value.Post_author, now, curThread.Thread_forum, (*posts)[key].Post_id, value.Post_message, value.Parent, curThread.Thread_id, pq.Array((*posts)[key].Path), (*posts)[key].Founder).Scan(&(*posts)[key].Post_id, &(*posts)[key].Post_created)
- if err != nil {
- return nil, err
- }
- _, err = stmtForumUser.Exec(value.Post_author, curThread.Thread_forum)
- if err != nil {
- return nil, err
- }
- }
- _, err = stmt.Exec()
- if err != nil {
- return nil, err
- }
- _, err = tx.Exec(`UPDATE forum SET posts = posts + $1 WHERE forum_slug = $2`,
- len(*posts), curThread.Thread_forum)
- if err != nil {
- return nil, err
- }
- err = tx.Commit()
- if err != nil {
- return nil, err
- }
- return posts, nil
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement