package main import "encoding/json" import "net/http" import "regexp" import "time" import "github.com/gin-gonic/gin" import "github.com/google/uuid" import "github.com/rs/zerolog/log" import "github.com/sneak/merp/models" func thingRegex() *regexp.Regexp { THING_REGEX, e := regexp.Compile(`^[a-zA-Z0-9\_\-]+$`) if e != nil { panic(e) } return THING_REGEX } /* func GetLatestMerps() gin.HandlerFunc { THING_REGEX := thingRegex() h := func(c *gin.Context) { } return h } func GetLatestMerp() gin.HandlerFunc { THING_REGEX := thingRegex() h := func(c *gin.Context) { } return h } */ func HandleNewMerp() gin.HandlerFunc { // server startup time THING_REGEX := thingRegex() // establish db connection *first*, before requests orm := models.GetOrmObject() h := func(c *gin.Context) { // request time thing := c.Param("thing") if THING_REGEX.MatchString(thing) == false { log.Debug().Msgf("%s didnt match", thing) c.JSON(http.StatusPreconditionFailed, gin.H{ "this": "failed", "status": http.StatusPreconditionFailed, "because": "invalid thing format, try a-zA-Z0-9-_", }) return } log.Debug().Msgf("%s matched", thing) //web.Get(`/merp/for/([A-Za-z0-9\-\_\.]+)`, merpHandler) // FIXME rate limit this a bit on thing+clientip+json to cut down on // repeated messages content := make(map[string]interface{}) respContent := gin.H{} // FIXME support POST data as well for k, v := range c.Request.URL.Query() { content[k] = v[0] respContent[k] = v[0] } u := uuid.New() at := time.Now().UTC() atString := at.Format(time.RFC3339) serialized, jsonerr := json.Marshal(content) if jsonerr != nil { c.JSON( http.StatusPreconditionFailed, gin.H{ "this": "failed", "status": http.StatusPreconditionFailed, "because": jsonerr.Error(), }, ) return } merp := models.Merp{ Created: at, Thing: thing, Content: string(serialized), UUID: u.String(), } _, err := orm.Insert(&merp) if err != nil { c.JSON( http.StatusPreconditionFailed, gin.H{ "this": "failed", "status": http.StatusPreconditionFailed, "because": err.Error(), }, ) return } c.JSON(http.StatusOK, gin.H{ "this": "succeeded", "by": "merping", "the": "merp", "with": gin.H{ "thing": thing, "created": atString, "content": respContent, "id": u.String(), }, }) } return h }