diff --git a/greataped/app/docs/docs.go b/greataped/app/docs/docs.go index 3b7971c..3359641 100644 --- a/greataped/app/docs/docs.go +++ b/greataped/app/docs/docs.go @@ -16,6 +16,38 @@ const docTemplate = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { + "/.well-known/webfinger": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "WebFinger" + ], + "parameters": [ + { + "type": "string", + "default": "acct:user@domain.com", + "description": "Resource", + "name": "resource", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, "/api/v1/login": { "post": { "consumes": [ @@ -48,6 +80,37 @@ const docTemplate = `{ } } }, + "/api/v1/profile": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cAdd access token here\u003e", + "description": "Insert your access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.User" + } + } + } + } + }, "/api/v1/signup": { "post": { "consumes": [ @@ -111,6 +174,37 @@ const docTemplate = `{ } } } + }, + "/u/{username}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "type": "string", + "description": "Username", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } } }, "definitions": { @@ -208,7 +302,7 @@ const docTemplate = `{ "private_profile": { "type": "boolean" }, - "publicKey": { + "public_key": { "type": "string" }, "username": { @@ -255,7 +349,7 @@ var SwaggerInfo = &swag.Spec{ BasePath: "/", Schemes: []string{}, Title: "GreatApe API", - Description: "GreatApe is a free audio and video social-media platform that can be used via an app. GreatApe is a Fediverse technology that supports federation via ActivityPub.", + Description: "GreatApe is a free audio and video social-media platform that can be used via an app. It is a Fediverse technology that supports federation via ActivityPub.", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, } diff --git a/greataped/app/docs/swagger.json b/greataped/app/docs/swagger.json index f03d6ac..1c53f76 100644 --- a/greataped/app/docs/swagger.json +++ b/greataped/app/docs/swagger.json @@ -1,13 +1,45 @@ { "swagger": "2.0", "info": { - "description": "GreatApe is a free audio and video social-media platform that can be used via an app. GreatApe is a Fediverse technology that supports federation via ActivityPub.", + "description": "GreatApe is a free audio and video social-media platform that can be used via an app. It is a Fediverse technology that supports federation via ActivityPub.", "title": "GreatApe API", "contact": {}, "version": "1.0" }, "basePath": "/", "paths": { + "/.well-known/webfinger": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "WebFinger" + ], + "parameters": [ + { + "type": "string", + "default": "acct:user@domain.com", + "description": "Resource", + "name": "resource", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } + }, "/api/v1/login": { "post": { "consumes": [ @@ -40,6 +72,37 @@ } } }, + "/api/v1/profile": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "User" + ], + "parameters": [ + { + "type": "string", + "default": "Bearer \u003cAdd access token here\u003e", + "description": "Insert your access token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/dto.User" + } + } + } + } + }, "/api/v1/signup": { "post": { "consumes": [ @@ -103,6 +166,37 @@ } } } + }, + "/u/{username}": { + "get": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ActivityPub" + ], + "parameters": [ + { + "type": "string", + "description": "Username", + "name": "username", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": true + } + } + } + } } }, "definitions": { @@ -200,7 +294,7 @@ "private_profile": { "type": "boolean" }, - "publicKey": { + "public_key": { "type": "string" }, "username": { diff --git a/greataped/app/docs/swagger.yaml b/greataped/app/docs/swagger.yaml index 88f71be..ca9eeb0 100644 --- a/greataped/app/docs/swagger.yaml +++ b/greataped/app/docs/swagger.yaml @@ -62,7 +62,7 @@ definitions: type: integer private_profile: type: boolean - publicKey: + public_key: type: string username: type: string @@ -89,11 +89,31 @@ definitions: info: contact: {} description: GreatApe is a free audio and video social-media platform that can be - used via an app. GreatApe is a Fediverse technology that supports federation via - ActivityPub. + used via an app. It is a Fediverse technology that supports federation via ActivityPub. title: GreatApe API version: "1.0" paths: + /.well-known/webfinger: + get: + consumes: + - application/json + parameters: + - default: acct:user@domain.com + description: Resource + in: query + name: resource + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + tags: + - WebFinger /api/v1/login: post: consumes: @@ -114,6 +134,26 @@ paths: $ref: '#/definitions/dto.LoginResponse' tags: - Authentication + /api/v1/profile: + get: + consumes: + - application/json + parameters: + - default: Bearer + description: Insert your access token + in: header + name: Authorization + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/dto.User' + tags: + - User /api/v1/signup: post: consumes: @@ -154,4 +194,24 @@ paths: $ref: '#/definitions/dto.VerifyResponse' tags: - Authentication + /u/{username}: + get: + consumes: + - application/json + parameters: + - description: Username + in: path + name: username + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: true + type: object + tags: + - ActivityPub swagger: "2.0" diff --git a/greataped/app/main.go b/greataped/app/main.go index 952f37d..bca28ab 100644 --- a/greataped/app/main.go +++ b/greataped/app/main.go @@ -1,6 +1,7 @@ package main import ( + "app/docs" "app/models/repos" "app/routes" "caching" @@ -13,9 +14,13 @@ import ( // @title GreatApe API // @version 1.0 -// @description GreatApe is a free audio and video social-media platform that can be used via an app. GreatApe is a Fediverse technology that supports federation via ActivityPub. +// @description GreatApe is a free audio and video social-media platform that can be used via an app. It is a Fediverse technology that supports federation via ActivityPub. // @BasePath / func main() { + if config.IsProduction() { + docs.SwaggerInfo.Host = config.DOMAIN + } + logger := logging.CreateLogger(logging.StdIOLogger) cache := caching.CreateCache(caching.InProcCache) diff --git a/greataped/app/models/dto/auth.go b/greataped/app/models/dto/auth.go index c6314b8..a7a7649 100644 --- a/greataped/app/models/dto/auth.go +++ b/greataped/app/models/dto/auth.go @@ -33,15 +33,15 @@ type VerifyResponse struct { type User struct { ID uint `json:"id"` Username string `json:"username"` - DisplayName string `json:"display_name"` + DisplayName string `json:"display_name,omitempty"` Email string `json:"email"` Password string `json:"-"` - Bio string `json:"bio"` - Github string `json:"github"` - Avatar string `json:"avatar"` - Banner string `json:"banner"` - ApiKey string `json:"api_key"` - PublicKey string `json:"publicKey"` + Bio string `json:"bio,omitempty"` + Github string `json:"github,omitempty"` + Avatar string `json:"avatar,omitempty"` + Banner string `json:"banner,omitempty"` + ApiKey string `json:"api_key,omitempty"` + PublicKey string `json:"public_key,omitempty"` Actor string `json:"actor,omitempty"` Webfinger string `json:"webfinger,omitempty"` PrivateProfile bool `json:"private_profile"` diff --git a/greataped/app/routes/login.go b/greataped/app/routes/login.go index 85b1bec..f4497e0 100644 --- a/greataped/app/routes/login.go +++ b/greataped/app/routes/login.go @@ -10,13 +10,13 @@ import ( "utility/password" ) -// Login godoc +// Login godoc // @Tags Authentication // @Accept json // @Produce json -// @Param payload body dto.LoginRequest true "Payload" -// @Success 200 {object} dto.LoginResponse -// @Router /api/v1/login [post] +// @Param payload body dto.LoginRequest true "Payload" +// @Success 200 {object} dto.LoginResponse +// @Router /api/v1/login [post] func _() {} var Login = route.New(HttpPost, "/api/v1/login", func(x IContext) error { diff --git a/greataped/app/routes/profile.go b/greataped/app/routes/profile.go index 98cc514..437fe3b 100644 --- a/greataped/app/routes/profile.go +++ b/greataped/app/routes/profile.go @@ -17,6 +17,15 @@ var Profile = route.New(HttpGet, "/profile", func(x IContext) error { }) }) +// GetProfile godoc +// @Tags User +// @Accept json +// @Produce json +// @Param Authorization header string true "Insert your access token" default(Bearer ) +// @Success 200 {object} dto.User +// @Router /api/v1/profile [get] +func _() {} + var GetProfile = route.New(HttpGet, "/api/v1/profile", func(x IContext) error { user, err := repos.FindUserById(x.GetUser()) if err != nil { diff --git a/greataped/app/routes/signup.go b/greataped/app/routes/signup.go index d2f3722..18b7c42 100644 --- a/greataped/app/routes/signup.go +++ b/greataped/app/routes/signup.go @@ -11,13 +11,13 @@ import ( "utility/password" ) -// Signup godoc +// Signup godoc // @Tags Authentication // @Accept json // @Produce json -// @Param payload body dto.SignupRequest true "Payload" -// @Success 200 {object} dto.SignupResponse -// @Router /api/v1/signup [post] +// @Param payload body dto.SignupRequest true "Payload" +// @Success 200 {object} dto.SignupResponse +// @Router /api/v1/signup [post] func _() {} var Signup = route.New(HttpPost, "/api/v1/signup", func(x IContext) error { @@ -63,13 +63,13 @@ var Signup = route.New(HttpPost, "/api/v1/signup", func(x IContext) error { }) }) -// Verify godoc +// Verify godoc // @Tags Authentication // @Accept json // @Produce json -// @Param payload body dto.VerifyRequest true "Payload" -// @Success 200 {object} dto.VerifyResponse -// @Router /api/v1/verify [post] +// @Param payload body dto.VerifyRequest true "Payload" +// @Success 200 {object} dto.VerifyResponse +// @Router /api/v1/verify [post] func _() {} var Verify = route.New(HttpPost, "/api/v1/verify", func(x IContext) error { diff --git a/greataped/app/routes/user.go b/greataped/app/routes/user.go index e58db46..bc4b935 100644 --- a/greataped/app/routes/user.go +++ b/greataped/app/routes/user.go @@ -8,6 +8,15 @@ import ( "server/route" ) +// User godoc +// @Tags ActivityPub +// @Accept json +// @Produce json +// @Param username path string true "Username" +// @Success 200 {object} map[string]interface{} +// @Router /u/{username} [get] +func _() {} + var User = route.New(contracts.HttpGet, "/u/:username", func(x contracts.IContext) error { username := domain.Username(x.Request().Params("username")) if username.IsEmpty() { @@ -34,7 +43,7 @@ var User = route.New(contracts.HttpGet, "/u/:username", func(x contracts.IContex str := x.StringUtil() actor := createActor(user) - if x.Request().AcceptsActivityStream() { + if x.Request().AcceptsActivityStream() || x.Request().AcceptsJSON() { return x.Activity(actor) } else if config.ExternalClient() { return x.Redirect(str.Format("%s://%s/u/%s", config.PROTOCOL, config.CLIENT_DOMAIN, user.Username)) diff --git a/greataped/app/routes/webfinger.go b/greataped/app/routes/webfinger.go index 9112702..3e6d5c0 100644 --- a/greataped/app/routes/webfinger.go +++ b/greataped/app/routes/webfinger.go @@ -8,6 +8,15 @@ import ( "server/route" ) +// WebFinger godoc +// @Tags WebFinger +// @Accept json +// @Produce json +// @Param resource query string true "Resource" default(acct:user@domain.com) +// @Success 200 {object} map[string]interface{} +// @Router /.well-known/webfinger [get] +func _() {} + var WebFinger = route.New(HttpGet, "/.well-known/webfinger", func(x IContext) error { resource := x.Request().Query("resource") if !x.StringUtil().Contains(resource, "acct:") {