package http import ( "io" "net/http" "git.capotej.com/capotej/communique/registry" "github.com/gin-gonic/gin" ) type Router struct { registry *registry.Registry } func NewRouter(registry *registry.Registry) *Router { return &Router{registry: registry} } func (s *Router) Start(zapWriter io.Writer) { router := gin.Default() router.SetTrustedProxies(nil) gin.DisableConsoleColor() gin.DefaultWriter = zapWriter // send gin logs to zap // Webfinger router.GET("/.well-known/webfinger", func(c *gin.Context) { resourceParam := c.Query("resource") resource, _ := s.registry.WebfingerResource(resourceParam) if resource != nil { c.JSON(http.StatusOK, resource) } else { c.JSON(http.StatusNotFound, nil) } }) // "User" endpoint router.GET("/actors/:actor", func(c *gin.Context) { actorParam := c.Param("actor") resource, _ := s.registry.Profile(actorParam) if resource != nil { c.Writer.Header().Set("Content-Type", "application/activity+json") c.JSON(http.StatusOK, resource) } else { c.JSON(http.StatusNotFound, nil) } }) router.GET("/actors/:actor/followers", func(c *gin.Context) { actorParam := c.Param("actor") resource, _ := s.registry.Followers(actorParam) if resource != nil { c.Writer.Header().Set("Content-Type", "application/activity+json") c.JSON(http.StatusOK, resource) } else { c.JSON(http.StatusNotFound, nil) } }) router.GET("/actors/:actor/following", func(c *gin.Context) { actorParam := c.Param("actor") resource, _ := s.registry.Following(actorParam) if resource != nil { c.Writer.Header().Set("Content-Type", "application/activity+json") c.JSON(http.StatusOK, resource) } else { c.JSON(http.StatusNotFound, nil) } }) // // Inbox // router.POST("/actors/:actor/inbox", func(c *gin.Context) { // actorParam := c.Param("actor") // resource := s.registry.Inbox(actorParam) // if resource != nil { // c.JSON(http.StatusOK, resource) // } else { // c.JSON(http.StatusNotFound, nil) // } // }) // Outbox router.GET("/actors/:actor/outbox", func(c *gin.Context) { actorParam := c.Param("actor") var resource map[string]interface{} if c.Query("page") == "true" { resource, _ = s.registry.OutboxCollection(actorParam) } else { resource, _ = s.registry.Outbox(actorParam) } if resource != nil { c.JSON(http.StatusOK, resource) c.Writer.Header().Set("Content-Type", "application/activity+json") } else { c.JSON(http.StatusNotFound, nil) } }) // Single activity router.GET("/actors/:actor/activity/:id", func(c *gin.Context) { actorParam := c.Param("actor") idParam := c.Param("id") var resource map[string]interface{} resource, _ = s.registry.ActivityOrNote("activity", actorParam, idParam) if resource != nil { c.Writer.Header().Set("Content-Type", "application/activity+json") c.JSON(http.StatusOK, resource) } else { c.JSON(http.StatusNotFound, nil) } }) // Single note router.GET("/actors/:actor/activity/:id/note", func(c *gin.Context) { actorParam := c.Param("actor") idParam := c.Param("id") var resource map[string]interface{} resource, _ = s.registry.ActivityOrNote("note", actorParam, idParam) if resource != nil { c.Writer.Header().Set("Content-Type", "application/activity+json") c.JSON(http.StatusOK, resource) } else { c.JSON(http.StatusNotFound, nil) } }) router.Run() }