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, }) }) }