now has an ORM and saves data (kinda)
This commit is contained in:
parent
9e9f49f139
commit
e0102004eb
18
Makefile
18
Makefile
|
@ -14,16 +14,28 @@ GOLDFLAGS += -X main.Buildtime=$(BUILDTIME)
|
||||||
GOLDFLAGS += -X main.Builduser=$(BUILDUSER)@$(BUILDHOST)
|
GOLDFLAGS += -X main.Builduser=$(BUILDUSER)@$(BUILDHOST)
|
||||||
GOLDFLAGS += -X main.Buildarch=$(BUILDARCH)
|
GOLDFLAGS += -X main.Buildarch=$(BUILDARCH)
|
||||||
GOLDFLAGS += -X main.Appname=$(APPNAME)
|
GOLDFLAGS += -X main.Appname=$(APPNAME)
|
||||||
GOFLAGS = -ldflags "-linkmode external -extldflags -static $(GOLDFLAGS)"
|
|
||||||
|
UNAME_S := $(shell uname -s)
|
||||||
|
|
||||||
|
# osx can't statically link apparently?!
|
||||||
|
ifeq ($(UNAME_S),Darwin)
|
||||||
|
GOFLAGS := -ldflags "$(GOLDFLAGS)"
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(UNAME_S),Darwin)
|
||||||
|
GOFLAGS := -ldflags "-static -linkmode external -extldflags $(GOLDFLAGS)"
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
default: run
|
default: run
|
||||||
|
|
||||||
run: build
|
run: build
|
||||||
DEBUG=1 ./$(APPNAME)
|
DEBUG=1 PORT=1111 ./$(APPNAME)
|
||||||
|
|
||||||
build: ./$(APPNAME)
|
build: ./$(APPNAME)
|
||||||
|
|
||||||
./$(APPNAME): *.go
|
./$(APPNAME): *.go models/*.go
|
||||||
go build -o $@ $(GOFLAGS) .
|
go build -o $@ $(GOFLAGS) .
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
80
merp.go
80
merp.go
|
@ -1,50 +1,100 @@
|
||||||
//3456789112345676892123456789312345678941234567895123456789612345678971234567898
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
|
import "encoding/json"
|
||||||
import "net/http"
|
import "net/http"
|
||||||
import "regexp"
|
import "regexp"
|
||||||
import "time"
|
import "time"
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
import "github.com/rs/zerolog/log"
|
import "github.com/rs/zerolog/log"
|
||||||
import "github.com/gin-gonic/gin"
|
import "github.com/gin-gonic/gin"
|
||||||
|
import "github.com/sneak/merp/models"
|
||||||
|
|
||||||
/*
|
func thingRegex() *regexp.Regexp {
|
||||||
func GetLatestMerps() gin.HandlerFunc {
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetLatestMerp() gin.HandlerFunc {
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
func HandleNewMerp() gin.HandlerFunc {
|
|
||||||
|
|
||||||
THING_REGEX, e := regexp.Compile(`^[a-zA-Z0-9\_\-]+$`)
|
THING_REGEX, e := regexp.Compile(`^[a-zA-Z0-9\_\-]+$`)
|
||||||
if e != nil {
|
if e != nil {
|
||||||
panic(e)
|
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 {
|
||||||
|
THING_REGEX := thingRegex()
|
||||||
|
|
||||||
h := func(c *gin.Context) {
|
h := func(c *gin.Context) {
|
||||||
thing := c.Param("thing")
|
thing := c.Param("thing")
|
||||||
if THING_REGEX.MatchString(thing) == false {
|
if THING_REGEX.MatchString(thing) == false {
|
||||||
log.Info().Msgf("%s didnt match", thing)
|
log.Debug().Msgf("%s didnt match", thing)
|
||||||
c.JSON(http.StatusPreconditionFailed, gin.H{
|
c.JSON(http.StatusPreconditionFailed, gin.H{
|
||||||
"this": "failed",
|
"this": "failed",
|
||||||
|
"status": http.StatusPreconditionFailed,
|
||||||
|
"because": "invalid thing format, try a-zA-Z0-9-_",
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
log.Info().Msgf("%s matched", thing)
|
log.Debug().Msgf("%s matched", thing)
|
||||||
//web.Get(`/merp/for/([A-Za-z0-9\-\_\.]+)`, merpHandler)
|
//web.Get(`/merp/for/([A-Za-z0-9\-\_\.]+)`, merpHandler)
|
||||||
|
|
||||||
content := gin.H{}
|
content := gin.H{}
|
||||||
|
// FIXME support POST data as well
|
||||||
for k, v := range c.Request.URL.Query() {
|
for k, v := range c.Request.URL.Query() {
|
||||||
content[k] = v[0]
|
content[k] = v[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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": fmt.Sprintf("%s", jsonerr),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
merp := models.Merp{
|
||||||
|
Created: at,
|
||||||
|
Thing: thing,
|
||||||
|
Content: string(serialized),
|
||||||
|
}
|
||||||
|
|
||||||
|
orm := models.GetOrmObject()
|
||||||
|
res, err := orm.Insert(&merp)
|
||||||
|
|
||||||
|
log.Info().Msgf("res: %s, err: %s", res, err)
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"this": "succeeded",
|
"this": "succeeded",
|
||||||
"by": "merping",
|
"by": "merping",
|
||||||
"the": "merp",
|
"the": "merp",
|
||||||
"with": gin.H{
|
"with": gin.H{
|
||||||
"thing": thing,
|
"thing": thing,
|
||||||
"created": time.Now().UTC().Format(time.RFC3339),
|
"created": atString,
|
||||||
"content": content,
|
"content": content,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
import "time"
|
||||||
|
import "github.com/astaxie/beego/orm"
|
||||||
|
import "github.com/rs/zerolog/log"
|
||||||
|
import _ "github.com/lib/pq"
|
||||||
|
|
||||||
|
var ormObject orm.Ormer
|
||||||
|
|
||||||
|
func Initialize() {
|
||||||
|
ConnectToDb()
|
||||||
|
SyncDB()
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConnectToDb - Initializes the ORM and Connection to the postgres DB
|
||||||
|
func ConnectToDb() {
|
||||||
|
orm.DefaultTimeLoc = time.UTC
|
||||||
|
|
||||||
|
POSTGRES_DB_URL := os.Getenv("POSTGRES_DB_URL")
|
||||||
|
|
||||||
|
orm.RegisterDriver("postgres", orm.DRPostgres)
|
||||||
|
orm.RegisterDataBase("default", "postgres", POSTGRES_DB_URL)
|
||||||
|
orm.SetMaxIdleConns("default", 1)
|
||||||
|
orm.SetMaxOpenConns("default", 5)
|
||||||
|
|
||||||
|
orm.RegisterModel(new(Merp))
|
||||||
|
ormObject = orm.NewOrm()
|
||||||
|
ormObject.Using("default")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func SyncDB() {
|
||||||
|
// Database alias.
|
||||||
|
name := "default"
|
||||||
|
|
||||||
|
// Drop table and re-create.
|
||||||
|
force := false
|
||||||
|
|
||||||
|
// Print log.
|
||||||
|
verbose := true
|
||||||
|
|
||||||
|
// Error.
|
||||||
|
err := orm.RunSyncdb(name, force, verbose)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Msg(err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetOrmObject - Getter function for the ORM object with which we can query the database
|
||||||
|
func GetOrmObject() orm.Ormer {
|
||||||
|
if ormObject == nil {
|
||||||
|
Initialize()
|
||||||
|
}
|
||||||
|
return ormObject
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package models
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type Merp struct {
|
||||||
|
ID int `json:"id" orm:"auto"`
|
||||||
|
Content string `json:"content" orm:"type(json)"`
|
||||||
|
Created time.Time `orm:"auto_now_add;type(datetime)"`
|
||||||
|
RemoteIP string `json:"remoteIP" orm:"size(128)"`
|
||||||
|
Thing string `json:"thing" orm:"size(128)"`
|
||||||
|
}
|
Loading…
Reference in New Issue