Advertisement
Guest User

Untitled

a guest
Jun 27th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.22 KB | None | 0 0
  1. func AddPosts(posts *[]models.Post, slugOrId string) (*[]models.Post, error) {
  2. newPosts := &[]models.Post{}
  3.  
  4. curThread := &models.Thread{}
  5.  
  6. if id, err := strconv.Atoi(slugOrId); err != nil {
  7.  
  8. curThread = FindThreadBySlug(slugOrId)
  9.  
  10. } else {
  11.  
  12. curThread = FindThreadById(id)
  13. }
  14.  
  15. if curThread == nil {
  16. return nil, &NotFound{"Thread", slugOrId}
  17. }
  18.  
  19. if len(*posts) == 0 {
  20. return newPosts, nil
  21. }
  22.  
  23. now := time.Now()
  24.  
  25. stmtForumUser, err := db.Prepare("INSERT INTO forum_users (nickname, forum) " +
  26. "VALUES ($1, $2) " +
  27. "ON CONFLICT (nickname, forum) DO NOTHING")
  28. if err != nil {
  29.  
  30. return nil, err
  31. }
  32. defer stmtForumUser.Close()
  33.  
  34. tx, err := db.Begin()
  35. if err != nil {
  36. return nil, err
  37. }
  38.  
  39. defer tx.Rollback()
  40.  
  41. stmt, err := tx.Prepare("INSERT INTO post (post_author, post_created, post_forum, post_id, post_message, parent, post_thread, path, founder) " +
  42. "VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING post_id, post_created")
  43. if err != nil {
  44. return nil, err
  45. }
  46. defer stmt.Close()
  47.  
  48. stmtUser, err := tx.Prepare("SELECT nickname FROM user_profile WHERE nickname = $1")
  49. if err != nil {
  50. return nil, err
  51. }
  52. defer stmtUser.Close()
  53.  
  54. stmtId, err := tx.Prepare("SELECT nextval(pg_get_serial_sequence('post', 'post_id'))")
  55.  
  56. if err != nil {
  57. return nil, err
  58. }
  59. defer stmtId.Close()
  60.  
  61. stmtPost, err := tx.Prepare("SELECT post_thread, path FROM post WHERE post_id = $1")
  62. if err != nil {
  63. return nil, err
  64. }
  65. defer stmtPost.Close()
  66.  
  67. for key, value := range *posts {
  68.  
  69. err = stmtUser.QueryRow(value.Post_author).Scan(&(*posts)[key].Post_author)
  70. if err != nil {
  71.  
  72. if err == sql.ErrNoRows {
  73. return nil, &NotFound{"User", value.Post_author}
  74. }
  75.  
  76. return nil, err
  77. }
  78. (*posts)[key].Post_thread = curThread.Thread_id
  79. (*posts)[key].Post_forum = curThread.Thread_forum
  80.  
  81. if value.Parent != 0 {
  82. parent := models.Post{}
  83.  
  84. err = stmtPost.QueryRow(value.Parent).Scan(&parent.Post_thread, pq.Array(&parent.Path))
  85.  
  86. if err != nil {
  87.  
  88. if err == sql.ErrNoRows {
  89. return nil, ErrParentPost
  90. }
  91.  
  92. return nil, err
  93. }
  94.  
  95. if parent.Post_thread != curThread.Thread_id {
  96. return nil, ErrParentPost
  97. }
  98.  
  99. (*posts)[key].Path = parent.Path
  100. }
  101.  
  102. err := stmtId.QueryRow().Scan(&(*posts)[key].Post_id)
  103.  
  104. if err != nil {
  105.  
  106. return nil, err
  107. }
  108.  
  109. (*posts)[key].Path = append((*posts)[key].Path, int64((*posts)[key].Post_id))
  110.  
  111. (*posts)[key].Founder = int((*posts)[key].Path[0])
  112.  
  113. 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)
  114.  
  115. if err != nil {
  116.  
  117. return nil, err
  118. }
  119.  
  120. _, err = stmtForumUser.Exec(value.Post_author, curThread.Thread_forum)
  121. if err != nil {
  122.  
  123. return nil, err
  124. }
  125.  
  126. }
  127.  
  128. _, err = stmt.Exec()
  129. if err != nil {
  130. return nil, err
  131. }
  132.  
  133. _, err = tx.Exec(`UPDATE forum SET posts = posts + $1 WHERE forum_slug = $2`,
  134. len(*posts), curThread.Thread_forum)
  135.  
  136. if err != nil {
  137.  
  138. return nil, err
  139. }
  140.  
  141. err = tx.Commit()
  142. if err != nil {
  143. return nil, err
  144. }
  145.  
  146. return posts, nil
  147.  
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement