skazanull/backend/api/handlers.go

280 lines
7.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package api
import (
"context"
"net/http"
"strconv"
"time"
"github.com/H1K0/SkazaNull/db"
"github.com/H1K0/SkazaNull/models"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
)
//#region User
func userAuth(c *gin.Context) {
var credentials struct {
Login string `form:"login" binding:"required"`
Password string `form:"password" binding:"required"`
}
err := c.ShouldBind(&credentials)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "И чё за шнягу ты мне кинул?"})
return
}
user, err := db.UserAuth(context.Background(), credentials.Login, credentials.Password)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
session := sessions.Default(c)
session.Set("user_id", user.ID)
session.Set("started", time.Now().Unix())
session.Save()
c.JSON(http.StatusOK, user)
}
func userUpdate(c *gin.Context) {
session := sessions.Default(c)
user_id, ok := session.Get("user_id").(string)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Ты это, залогинься сначала что ли, а то чё как крыса"})
return
}
var body map[string]string
err := c.BindJSON(&body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "И чё за шнягу ты мне кинул?"})
return
}
var user models.User
ctx := context.Background()
newTelegramIDStr, ok := body["telegram_id"]
if ok && newTelegramIDStr != "" {
newTelegramID, err := strconv.ParseInt(newTelegramIDStr, 10, 0)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "telegram_id param must be int"})
return
}
user, err = db.UserUpdateTelegramID(ctx, user_id, newTelegramID)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
newName, ok := body["name"]
if ok && newName != "" {
user, err = db.UserUpdateName(ctx, user_id, newName)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
newLogin, ok := body["login"]
if ok && newLogin != "" {
user, err = db.UserUpdateLogin(ctx, user_id, newLogin)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
newPassword, ok := body["password"]
if ok && newPassword != "" {
user, err = db.UserUpdatePassword(ctx, user_id, newPassword)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
c.JSON(http.StatusOK, user)
}
//#endregion User
//#region Quotes
func quotesGet(c *gin.Context) {
session := sessions.Default(c)
user_id, ok := session.Get("user_id").(string)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Ты это, залогинься сначала что ли, а то чё как крыса"})
return
}
filter, ok := c.GetQuery("filter")
if !ok {
filter = ""
}
sort, ok := c.GetQuery("sort")
if !ok {
sort = "-datetime"
}
var limit int64
limitStr, ok := c.GetQuery("limit")
if ok {
var err error
limit, err = strconv.ParseInt(limitStr, 10, 0)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "limit param must be int"})
return
}
} else {
limit = 10
}
var offset int64
offsetStr, ok := c.GetQuery("offset")
if ok {
var err error
offset, err = strconv.ParseInt(offsetStr, 10, 0)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "offset param must be int"})
return
}
} else {
offset = 0
}
quotes, err := db.QuotesGet(c, user_id, filter, sort, int(limit), int(offset))
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
c.JSON(http.StatusOK, quotes)
}
func quoteGet(c *gin.Context) {
session := sessions.Default(c)
user_id, ok := session.Get("user_id").(string)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Ты это, залогинься сначала что ли, а то чё как крыса"})
return
}
quote_id := c.Param("id")
quote, err := db.QuoteGet(context.Background(), user_id, quote_id)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
c.JSON(http.StatusOK, quote)
}
func quoteAdd(c *gin.Context) {
session := sessions.Default(c)
user_id, ok := session.Get("user_id").(string)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Ты это, залогинься сначала что ли, а то чё как крыса"})
return
}
var body map[string]string
err := c.BindJSON(&body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "И чё за шнягу ты мне кинул?"})
return
}
text, ok := body["text"]
if !ok || text == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "Э, а где цитата?"})
return
}
author, ok := body["author"]
if !ok || author == "" {
c.JSON(http.StatusBadRequest, gin.H{"error": "Цитата может быть сказана только тем, кто её сказанул! А кто сказанул эту цитату?"})
return
}
var datetime time.Time
datetimeStr, ok := body["datetime"]
if ok {
datetime, err = time.Parse(time.RFC3339, datetimeStr)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Чёт дата и время у тебя какие-то кривые..."})
return
}
} else {
datetime = time.Now()
}
quote, err := db.QuoteAdd(context.Background(), user_id, text, author, datetime)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
c.JSON(http.StatusCreated, quote)
}
func quoteUpdate(c *gin.Context) {
session := sessions.Default(c)
user_id, ok := session.Get("user_id").(string)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Ты это, залогинься сначала что ли, а то чё как крыса"})
return
}
quote_id := c.Param("id")
var body map[string]string
err := c.BindJSON(&body)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "И чё за шнягу ты мне кинул?"})
return
}
var quote models.Quote
ctx := context.Background()
newText, ok := body["text"]
if ok && newText != "" {
quote, err = db.QuoteUpdateText(ctx, user_id, quote_id, newText)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
newAuthor, ok := body["author"]
if ok && newAuthor != "" {
quote, err = db.QuoteUpdateAuthor(ctx, user_id, quote_id, newAuthor)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
datetimeStr, ok := body["datetime"]
if ok && datetimeStr != "" {
newDatetime, err := time.Parse(time.RFC3339, datetimeStr)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Чёт дата и время у тебя какие-то кривые..."})
return
}
quote, err = db.QuoteUpdateDatetime(context.Background(), user_id, quote_id, newDatetime)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
}
c.JSON(http.StatusOK, quote)
}
func quoteDelete(c *gin.Context) {
session := sessions.Default(c)
user_id, ok := session.Get("user_id").(string)
if !ok {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Ты это, залогинься сначала что ли, а то чё как крыса"})
return
}
quote_id := c.Param("id")
err := db.QuoteDelete(context.Background(), user_id, quote_id)
if err != nil {
status, message := HandleDBError(err)
c.JSON(status, gin.H{"error": message})
return
}
c.JSON(http.StatusNoContent, nil)
}
//#endregion Quotes