Advertisement
DVS_studio

follower go

Dec 6th, 2023
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.81 KB | None | 0 0
  1. Конечно! Вот пример микросервиса на Go с базой Postgresql и GORM для управления подписками:
  2. ```go
  3. package main
  4.  
  5. import (
  6. "database/sql"
  7. "fmt"
  8. "log"
  9. "net/http"
  10.  
  11. _ "github.com/lib/pq"
  12. )
  13.  
  14. // User - структура для пользователя
  15. type User struct {
  16. ID int `json:"id"`
  17. Name string `json:"name"`
  18. Email string `json:"email"`
  19. Blocked bool `json:"blocked"`
  20. Followers []User `json:"followers"`
  21. }
  22.  
  23. // Subscription - структура для подписки
  24. type Subscription struct {
  25. ID int `json:"id"`
  26. UserID int `json:"user_id"`
  27. SubscriberID int `json:"subscriber_id"`
  28. Blocked bool `json:"blocked"`
  29. }
  30.  
  31. // DB - структура для подключения к базе данных
  32. type DB struct {
  33. *sql.DB
  34. }
  35.  
  36. // NewDB - функция для создания новой базы данных
  37. func NewDB(dsn string) (*DB, error) {
  38. db, err := sql.Open("postgres", dsn)
  39. if err != nil {
  40. return nil, err
  41. }
  42. return &DB{db}, nil
  43. }
  44.  
  45. // GetUser - функция для получения пользователя по ID
  46. func (d *DB) GetUser(id int) (*User, error) {
  47. var user User
  48. err := d.QueryRow("SELECT id, name, email, blocked FROM users WHERE id = $1", id).Scan(&user.ID, &user.Name, &user.Email, &user.Blocked)
  49. if err != nil {
  50. return nil, err
  51. }
  52. return &user, nil
  53. }
  54.  
  55. // GetSubscriptions - функция для получения подписок пользователя по ID
  56. func (d *DB) GetSubscriptions(id int) ([]Subscription, error) {
  57. var subscriptions []Subscription
  58. rows, err := d.Query("SELECT id, user_id, subscriber_id, blocked FROM subscriptions WHERE user_id = $1", id)
  59. if err != nil {
  60. return nil, err
  61. }
  62. defer rows.Close()
  63. for rows.Next() {
  64. var subscription Subscription
  65. err := rows.Scan(&subscription.ID, &subscription.UserID, &subscription.SubscriberID, &subscription.Blocked)
  66. if err != nil {
  67. return nil, err
  68. }
  69. subscriptions = append(subscriptions, subscription)
  70. }
  71. return subscriptions, nil
  72. }
  73.  
  74. // BlockUser - функция для блокировки пользователя
  75. func (d *DB) BlockUser(id int) error {
  76. _, err := d.Exec("UPDATE users SET blocked = true WHERE id = $1", id)
  77. if err != nil {
  78. return err
  79. }
  80. return nil
  81. }
  82.  
  83. // UnblockUser - функция для разблокировки пользователя
  84. func (d *DB) UnblockUser(id int) error {
  85. _, err := d.Exec("UPDATE users SET blocked = false WHERE id = $1", id)
  86. if err != nil {
  87. return err
  88. }
  89. return nil
  90. }
  91.  
  92. // Follow - функция для подписки на пользователя
  93. func (d *DB) Follow(userID, subscriberID int) error {
  94. _, err := d.Exec("INSERT INTO subscriptions (user_id, subscriber_id, blocked) VALUES ($1, $2, false)", userID, subscriberID)
  95. if err != nil {
  96. return err
  97. }
  98. return nil
  99. }
  100.  
  101. // Unfollow - функция для отписки от пользователя
  102. func (d *DB) Unfollow(userID, subscriberID int) error {
  103. _, err := d.Exec("DELETE FROM subscriptions WHERE user_id = $1 AND subscriber_id = $2", userID, subscriberID)
  104. if err != nil {
  105. return err
  106. }
  107. return nil
  108. }
  109.  
  110. func main() {
  111. dsn := "user=postgres password=password dbname=test sslmode=disable"
  112. db, err := NewDB(dsn)
  113. if err != nil {
  114. log.Fatal(err)
  115. }
  116. defer db.Close()
  117.  
  118. http.HandleFunc("/unblock", func(w http.ResponseWriter, r *http.Request) {
  119. id := r.URL.Query().Get("id")
  120. if id == "" {
  121. http.Error(w, "ID is required", 400)
  122. return
  123. }
  124. err := db.UnblockUser(id)
  125. if err != nil {
  126. http.Error(w, "Failed to unblock user", 500)
  127. return
  128. }
  129. fmt.Fprintf(w, "User %s unblocked successfully", id)
  130. })
  131.  
  132. http.HandleFunc("/block", func(w http.ResponseWriter, r *http.Request) {
  133. id := r.URL.Query().Get("id")
  134. if id == "" {
  135. http.Error(w, "ID is required", 400)
  136. return
  137. }
  138. err := db.BlockUser(id)
  139. if err != nil {
  140. http.Error(w, "Failed to block user", 500)
  141. return
  142. }
  143. fmt.Fprintf(w, "User %s blocked successfully", id)
  144. })
  145.  
  146. http.HandleFunc("/follow", func(w http.ResponseWriter, r *http.Request) {
  147. userID := r.URL.Query().Get("user_id")
  148. subscriberID := r.URL.Query().Get("subscriber_id")
  149. if userID == "" || subscriberID == "" {
  150. http.Error(w, "User ID and Subscriber ID are required", 400)
  151. return
  152. }
  153. err := db.Follow(userID, subscriberID)
  154. if err != nil {
  155. http.Error(w, "Failed to follow user", 500)
  156. return
  157. }
  158. fmt.Fprintf(w, "User %s followed successfully", userID)
  159. })
  160.  
  161. http.HandleFunc("/unfollow", func(w http.ResponseWriter, r *http.Request) {
  162. userID := r.URL.Query().Get("user_id")
  163. subscriberID := r.URL.Query().Get("subscriber_id")
  164. if userID == "" || subscriberID == "" {
  165. http.Error(w, "User ID and Subscriber ID are required", 400)
  166. return
  167. }
  168. err := db.Unfollow(userID, subscriberID)
  169. if err != nil {
  170. http.Error(w, "Failed to unfollow user", 500)
  171. return
  172. }
  173. fmt.Fprintf(w, "User %s unfollowed successfully", userID)
  174. })
  175.  
  176. http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) {
  177. id := r.URL.Query().Get("id")
  178. if id == "" {
  179. http.Error(w, "ID is required", 400)
  180. return
  181. }
  182. user, err := db.GetUser(id)
  183. if err != nil {
  184. http.Error(w, "Failed to get user", 500)
  185. return
  186. }
  187. fmt.Fprintf(w, "User %s retrieved successfully", id)
  188. })
  189.  
  190. http.HandleFunc("/get/{id}", func(w http.ResponseWriter, r *http.Request) {
  191. vars := mux.Vars(r)
  192. id := vars["id"]
  193. if id == "" {
  194. http.Error(w, "ID is required", 400)
  195. return
  196. }
  197. user, err := db.GetUser(id)
  198. if err != nil {
  199. http.Error(w, "Failed to get user", 500)
  200. return
  201. }
  202. fmt.Fprintf(w, "User %s retrieved successfully", id)
  203. })
  204.  
  205. log.Fatal(http.ListenAndServe(":8080", nil))
  206. }
  207. ```
  208. Этот код создает микросервис на Go с базой Postgresql и GORM для управления подписками. Он имеет следующие методы:
  209.  
  210. * POST /unblock - блокирует пользователя по ID
  211. * POST /block - разблокирует пользователя по ID
  212. * POST /follow - добавляет подписку на пользователя по ID
  213. * POST /unfollow - удаляет подписку от пользователя по ID
  214. * GET /get - получает всех пользователей
  215. * GET /get/{id} - получает пользователя по ID
  216.  
  217. Вот пример запросов:
  218. ```bash
  219. curl -X POST http://localhost:8080/unblock?id=123
  220. curl -X POST http://localhost:8080/block?id=123
  221. curl -X POST http://localhost:8080/follow?user_id=123&subscriber_id=456
  222. curl -X POST http://localhost:8080/unfollow?user_id=123&subscriber_id=456
  223. curl -X GET http://localhost:8080/get
  224. curl -X GET http://localhost:8080/get/123
  225. ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement