From 61b976259a482be75a8dc42b659e6fd278466ea6 Mon Sep 17 00:00:00 2001 From: inhosin Date: Sat, 7 Sep 2019 19:10:28 +0300 Subject: [PATCH] bing work with gorm --- Gopkg.lock | 43 +++++++++++++++++++++++++++++++++ data/models/activity.go | 53 +++++++++++++++++++++++++++++++++++++++++ data/models/group.go | 17 +++++++------ data/models/user.go | 19 +++++++++++++++ handlers/groups/post.go | 2 +- handlers/note/get.go | 53 +++++++++++++++++++++++++++++++++++++++++ main.go | 29 +++++++++++++++++++--- 7 files changed, 203 insertions(+), 13 deletions(-) create mode 100644 data/models/activity.go create mode 100644 data/models/user.go create mode 100644 handlers/note/get.go diff --git a/Gopkg.lock b/Gopkg.lock index f7a5c56..150d97e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -30,6 +30,38 @@ revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" version = "v1.3.2" +[[projects]] + digest = "1:cbec35fe4d5a4fba369a656a8cd65e244ea2c743007d8f6c1ccb132acf9d1296" + name = "github.com/gorilla/mux" + packages = ["."] + pruneopts = "UT" + revision = "00bdffe0f3c77e27d2cf6f5c70232a2d3e4d9c15" + version = "v1.7.3" + +[[projects]] + digest = "1:17275ec8407e731ae22cc511d52391b2ac31982f23b53b1100265c575dc5cc9f" + name = "github.com/gosimple/slug" + packages = ["."] + pruneopts = "UT" + revision = "984b6d1a0ae5d1ecf6d718f4e990883d281ba3b8" + version = "v1.7.0" + +[[projects]] + digest = "1:09424e4abeba1d2fc80c47c26347a3eed24f9cfd83173131dd048479ca6e041a" + name = "github.com/jinzhu/gorm" + packages = ["."] + pruneopts = "UT" + revision = "836fb2c19d84dac7b0272958dfb9af7cf0d0ade4" + version = "v1.9.10" + +[[projects]] + digest = "1:01ed62f8f4f574d8aff1d88caee113700a2b44c42351943fa73cc1808f736a50" + name = "github.com/jinzhu/inflection" + packages = ["."] + pruneopts = "UT" + revision = "f5c5f50e6090ae76a29240b61ae2a90dd810112e" + version = "v1.0.0" + [[projects]] digest = "1:709cd2a2c29cc9b89732f6c24846bbb9d6270f28ef5ef2128cc73bd0d6d7bff9" name = "github.com/json-iterator/go" @@ -70,6 +102,14 @@ revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" version = "1.0.1" +[[projects]] + branch = "master" + digest = "1:e6a29574542c00bb18adb1bfbe629ff88c468c2af2e2e953d3e58eda07165086" + name = "github.com/rainycape/unidecode" + packages = ["."] + pruneopts = "UT" + revision = "cb7f23ec59bec0d61b19c56cd88cee3d0cc1870c" + [[projects]] digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" name = "github.com/sirupsen/logrus" @@ -115,6 +155,9 @@ analyzer-version = 1 input-imports = [ "github.com/gin-gonic/gin", + "github.com/gorilla/mux", + "github.com/gosimple/slug", + "github.com/jinzhu/gorm", "github.com/sirupsen/logrus", ] solver-name = "gps-cdcl" diff --git a/data/models/activity.go b/data/models/activity.go new file mode 100644 index 0000000..cb9cf99 --- /dev/null +++ b/data/models/activity.go @@ -0,0 +1,53 @@ +package models + +import ( + "database/sql" + "time" +) + +type Activity struct { + Id string `json:"id"` + Payload string `json:"note"` + Remote bool `json:"remote"` + Group `json:"group"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +// GetActivity gets a Activity at any slug +func GetActivity(db *sql.DB, slug string) (*Activity, error) { + row := db.QueryRow(` + SELECT id, Payload, remote, goupid, created_at, updated_at + FROM activity WHERE id = $1 + `, slug) + + var note Activity + err := row.Scan(¬e.Slug, + ¬e.Name, ¬e.Note, ¬e.CreatedAt, ¬e.UpdatedAt) + + // This is not an error from the user's perspective + if err == sql.ErrNoRows { + return nil, nil + } + if err != nil { + return nil, err + } + + return ¬e, nil +} + +/* +// PutNote creates a note with this name and note +func PutActivity(db *sql.DB, name string, note string) (string, error) { + // TODO make guid but not slug + id := slugify.MakeLang(name, "en") + + query := ` + INSERT INTO activity (id, name, note) + VALUES ($1, $2, $3) + ` + + _, err := db.Exec(query, slug, name, note) + return slug, err +} +*/ diff --git a/data/models/group.go b/data/models/group.go index 957c375..2fb8f61 100644 --- a/data/models/group.go +++ b/data/models/group.go @@ -2,21 +2,20 @@ package models import ( "database/sql" - "time" - slugify "github.com/gosimple/slug" + "github.com/jinzhu/gorm" ) // Group is a collection of Hubs (equivalent to ActivityPub Organizations) // Refers to the https://www.w3.org/TR/activitystreams-vocabulary/#dfn-group // Also refers to the Groups table in the database type Group struct { - Slug string `json:"slug"` - Name string `json:"name"` - Note string `json:"note"` - Type string - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + gorm.Model + Id string `json:"id"` + Name string `json:"name"` + Note string `json:"note"` + Type string + UserID uint } // GetGroup returns a single Group object or nil @@ -27,7 +26,7 @@ func GetGroup(db *sql.DB, slug string) (*Group, error) { `, slug) var group Group - err := row.Scan(&group.Slug, &group.Name, &group.Note, &group.CreatedAt, &group.UpdatedAt) + err := row.Scan(&group.id, &group.Name, &group.Note, &group.CreatedAt, &group.UpdatedAt) if err == sql.ErrNoRows { return nil, nil diff --git a/data/models/user.go b/data/models/user.go new file mode 100644 index 0000000..0d78deb --- /dev/null +++ b/data/models/user.go @@ -0,0 +1,19 @@ +package models + +import ( + "github.com/jinzhu/gorm" +) + +type User struct { + gorm.Model + Name string + Role string `gorm:"size:255"` + Groups []Group `gorm:"foreignkey:UserID"` +} + +type Profile struct { + gorm.Model + UserID int + User User + Email string `gorm:"type:varchar(100);unique_index"` +} diff --git a/handlers/groups/post.go b/handlers/groups/post.go index bf5ea6a..556280f 100644 --- a/handlers/groups/post.go +++ b/handlers/groups/post.go @@ -19,7 +19,7 @@ type createGroupResponse struct { // Create adds an group to the database func Create(c *gin.Context) { var body createGroupRequest - c.BindJSON(&body) + _ = c.BindJSON(&body) db := data.GetDB() slug, err := models.PutGroup(db, body.Name, body.Note) diff --git a/handlers/note/get.go b/handlers/note/get.go new file mode 100644 index 0000000..22d96b3 --- /dev/null +++ b/handlers/note/get.go @@ -0,0 +1,53 @@ +package note + +import ( + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/gorilla/mux" + "net/http" + "net/url" +) + +// Get returns a Note +// +// Expects a `{noteid}` url variable +// in the route: `/api/note/{noteid}` +func Get(c *gin.Context) { + noteId := c.Param("noteid") + + if noteId == "" { + c.String(http.StatusInternalServerError, "Bad request, no slug in url") + return + } + + // Attempt to grab the Note + note, err := models.GetNote(data.GetPool(), noteId) + + // 500 because something went wrong with the database + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // 404 because something we couldn't find the show + if show == nil { + http.Error(w, slug+" does not exist on this server", http.StatusNotFound) + return + } + + // Convert to an ActivityPub object + url, err := url.Parse(handlers.GetFullHostname() + "/api/show/" + slug) + actor := activity.NewOrganization(show.Name, url) + + // Turn the show into JSON + bytes, err := json.Marshal(actor) + + // 500 because something went wrong marshaling the show + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + // Success! + w.Write(bytes) +} diff --git a/main.go b/main.go index 3db32d5..b1df704 100644 --- a/main.go +++ b/main.go @@ -17,15 +17,38 @@ func init() { func main() { r := gin.Default() r.GET("/.well-known/webfinger", webfinder.Get) + + // App routes api := r.Group("/api") { - api.GET("/api/group/:name", groups.Get) - api.POST("/api/group", groups.Create) + api.GET("/group/:name", groups.Get) + api.GET("/group/:name/tags", groups.Get) + api.GET("/group/:name/tags", groups.Get) + api.GET("/group/:name/featured", groups.Get) + api.GET("/group/:name/following", groups.Get) + api.GET("/group/:name/outbox", groups.Get) + api.GET("/group/:name/inbox", groups.Create) + api.POST("/group/:name/inbox", groups.Create) + api.POST("/group", groups.Create) } + // r.GET("/@:name", groups.GetGroup) + // r.GET("/note/:noteid", note.GetNote) + + // Activity pub routes + ap := r.Group("/activity") + { + ap.GET("/group/:name", groups.Get) + ap.GET("/group/:name/followers", groups.Get) + ap.GET("/group/:name/following", groups.Get) + ap.GET("/group/:name/outbox", groups.Get) + ap.GET("/group/:name/inbox", groups.Create) + ap.POST("/group/:name/inbox", groups.Create) + } + r.GET("/health", healthHandler) // Add support for PORT env - port := "8080" + port := "8090" if fromEnv := os.Getenv("PORT"); fromEnv != "" { port = fromEnv }