79 lines
1.4 KiB
Go
79 lines
1.4 KiB
Go
package stringunpack
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"git.grachevko.ru/grachevko/h/string-unpack/internal/sql"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/jackc/pgx/v5"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var queries sql.Querier
|
|
|
|
func Setup(ctx context.Context, logger *zap.Logger, r *gin.RouterGroup, conn *pgx.Conn) {
|
|
if queries != nil {
|
|
panic("Setup must call only once")
|
|
}
|
|
|
|
queries = sql.New(conn)
|
|
|
|
unpack := func(input string) (r string, err error) {
|
|
r, err = Unpack(input)
|
|
|
|
{ // history
|
|
result := r
|
|
if err != nil {
|
|
result = fmt.Sprintf("err: %s", err.Error())
|
|
}
|
|
_, err := queries.Insert(ctx, sql.InsertParams{
|
|
Input: input,
|
|
Result: result,
|
|
})
|
|
if err != nil {
|
|
logger.Error("pg insert", zap.Error(err))
|
|
}
|
|
} // history
|
|
|
|
return
|
|
}
|
|
|
|
r.GET("history", func(c *gin.Context) {
|
|
latest, err := queries.Latest(ctx)
|
|
if err != nil {
|
|
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{
|
|
"err": err.Error(),
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, latest)
|
|
})
|
|
|
|
r.GET(":s", func(c *gin.Context) {
|
|
s := c.Param("s")
|
|
|
|
result, err := unpack(s)
|
|
if errors.Is(err, ErrIncorrectString) {
|
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{
|
|
"err": err.Error(),
|
|
})
|
|
|
|
return
|
|
}
|
|
if err != nil {
|
|
logger.Error("unpack", zap.Error(err))
|
|
|
|
c.AbortWithStatus(http.StatusInternalServerError)
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"result": result,
|
|
})
|
|
})
|
|
}
|