diff --git a/docs/api/swagger.yaml b/docs/api/swagger.yaml index ae8888af4..7de635d1e 100644 --- a/docs/api/swagger.yaml +++ b/docs/api/swagger.yaml @@ -12115,6 +12115,32 @@ paths: summary: Initiate a websocket connection for live streaming of statuses and notifications. tags: - streaming + /api/v1/suggestions: + get: + description: 'THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array.' + operationId: getSuggestions + produces: + - application/json + responses: + "200": + description: "" + schema: + items: + type: object + maxItems: 0 + type: array + "401": + description: unauthorized + "403": + description: forbidden + "406": + description: not acceptable + security: + - OAuth2 Bearer: + - read + summary: Accounts that are promoted by staff, or that the user has had past positive interactions with, but is not yet following. + tags: + - suggestions /api/v1/tags/{tag_name}: get: description: If the tag does not exist, this method will not create it in the database. @@ -12567,6 +12593,63 @@ paths: summary: Invalidate the target token, removing it from the database and making it unusable. tags: - tokens + /api/v1/trends/links: + get: + description: 'THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array.' + operationId: getTrendingLinks + produces: + - application/json + responses: + "200": + description: "" + schema: + items: + type: object + maxItems: 0 + type: array + "406": + description: not acceptable + summary: Links that have been shared more than others. + tags: + - trends + /api/v1/trends/statuses: + get: + description: 'THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array.' + operationId: getTrendingStatuses + produces: + - application/json + responses: + "200": + description: "" + schema: + items: + type: object + maxItems: 0 + type: array + "406": + description: not acceptable + summary: Statuses that have been interacted with more than others. + tags: + - trends + /api/v1/trends/tags: + get: + description: 'THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array.' + operationId: getTrendingTags + produces: + - application/json + responses: + "200": + description: "" + schema: + items: + type: object + maxItems: 0 + type: array + "406": + description: not acceptable + summary: View hashtags that are currently being used more frequently than usual. + tags: + - trends /api/v1/user: get: operationId: getUser diff --git a/internal/api/client.go b/internal/api/client.go index 829c9326d..45490b843 100644 --- a/internal/api/client.go +++ b/internal/api/client.go @@ -52,9 +52,11 @@ import ( "code.superseriousbusiness.org/gotosocial/internal/api/client/search" "code.superseriousbusiness.org/gotosocial/internal/api/client/statuses" "code.superseriousbusiness.org/gotosocial/internal/api/client/streaming" + "code.superseriousbusiness.org/gotosocial/internal/api/client/suggestions" "code.superseriousbusiness.org/gotosocial/internal/api/client/tags" "code.superseriousbusiness.org/gotosocial/internal/api/client/timelines" "code.superseriousbusiness.org/gotosocial/internal/api/client/tokens" + "code.superseriousbusiness.org/gotosocial/internal/api/client/trends" "code.superseriousbusiness.org/gotosocial/internal/api/client/user" "code.superseriousbusiness.org/gotosocial/internal/db" "code.superseriousbusiness.org/gotosocial/internal/middleware" @@ -100,9 +102,11 @@ type Client struct { search *search.Module // api/v1/search, api/v2/search statuses *statuses.Module // api/v1/statuses streaming *streaming.Module // api/v1/streaming + suggestions *suggestions.Module // api/v2/suggestions tags *tags.Module // api/v1/tags timelines *timelines.Module // api/v1/timelines tokens *tokens.Module // api/v1/tokens + trends *trends.Module // api/v1/trends user *user.Module // api/v1/user } @@ -155,9 +159,11 @@ func (c *Client) Route(r *router.Router, m ...gin.HandlerFunc) { c.search.Route(h) c.statuses.Route(h) c.streaming.Route(h) + c.suggestions.Route(h) c.tags.Route(h) c.timelines.Route(h) c.tokens.Route(h) + c.trends.Route(h) c.user.Route(h) } @@ -198,9 +204,11 @@ func NewClient(state *state.State, p *processing.Processor) *Client { search: search.New(p), statuses: statuses.New(p), streaming: streaming.New(p, time.Second*30, 4096), + suggestions: suggestions.New(p), tags: tags.New(p), timelines: timelines.New(p), tokens: tokens.New(p), + trends: trends.New(p), user: user.New(p), } } diff --git a/internal/api/client/suggestions/suggestions.go b/internal/api/client/suggestions/suggestions.go new file mode 100644 index 000000000..1a63d900e --- /dev/null +++ b/internal/api/client/suggestions/suggestions.go @@ -0,0 +1,93 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package suggestions + +import ( + "net/http" + + apiutil "code.superseriousbusiness.org/gotosocial/internal/api/util" + "code.superseriousbusiness.org/gotosocial/internal/gtserror" + "code.superseriousbusiness.org/gotosocial/internal/processing" + "github.com/gin-gonic/gin" +) + +const ( + BasePath = "/v2/suggestions" +) + +type Module struct { + processor *processing.Processor +} + +func New(processor *processing.Processor) *Module { + return &Module{ + processor: processor, + } +} + +// SuggestionsGETHandler swagger:operation GET /api/v1/suggestions getSuggestions +// +// Accounts that are promoted by staff, or that the user has had past positive interactions with, but is not yet following. +// +// THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array. +// +// --- +// tags: +// - suggestions +// +// produces: +// - application/json +// +// security: +// - OAuth2 Bearer: +// - read +// +// responses: +// '200': +// schema: +// type: array +// items: +// type: object +// maxItems: 0 +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '406': +// description: not acceptable +func (m *Module) SuggestionsGETHandler(c *gin.Context) { + _, errWithCode := apiutil.TokenAuth(c, + true, true, true, true, + apiutil.ScopeRead, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, apiutil.EmptyJSONArray) +} + +func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) { + attachHandler(http.MethodGet, BasePath, m.SuggestionsGETHandler) +} diff --git a/internal/api/client/trends/links.go b/internal/api/client/trends/links.go new file mode 100644 index 000000000..72444538e --- /dev/null +++ b/internal/api/client/trends/links.go @@ -0,0 +1,57 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package trends + +import ( + "net/http" + + apiutil "code.superseriousbusiness.org/gotosocial/internal/api/util" + "code.superseriousbusiness.org/gotosocial/internal/gtserror" + "github.com/gin-gonic/gin" +) + +// LinksGETHandler swagger:operation GET /api/v1/trends/links getTrendingLinks +// +// Links that have been shared more than others. +// +// THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array. +// +// --- +// tags: +// - trends +// +// produces: +// - application/json +// +// responses: +// '200': +// schema: +// type: array +// items: +// type: object +// maxItems: 0 +// '406': +// description: not acceptable +func (m *Module) LinksGETHandler(c *gin.Context) { + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, apiutil.EmptyJSONArray) +} diff --git a/internal/api/client/trends/statuses.go b/internal/api/client/trends/statuses.go new file mode 100644 index 000000000..f8282095e --- /dev/null +++ b/internal/api/client/trends/statuses.go @@ -0,0 +1,57 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package trends + +import ( + "net/http" + + apiutil "code.superseriousbusiness.org/gotosocial/internal/api/util" + "code.superseriousbusiness.org/gotosocial/internal/gtserror" + "github.com/gin-gonic/gin" +) + +// StatusesGETHandler swagger:operation GET /api/v1/trends/statuses getTrendingStatuses +// +// Statuses that have been interacted with more than others. +// +// THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array. +// +// --- +// tags: +// - trends +// +// produces: +// - application/json +// +// responses: +// '200': +// schema: +// type: array +// items: +// type: object +// maxItems: 0 +// '406': +// description: not acceptable +func (m *Module) StatusesGETHandler(c *gin.Context) { + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, apiutil.EmptyJSONArray) +} diff --git a/internal/api/client/trends/tags.go b/internal/api/client/trends/tags.go new file mode 100644 index 000000000..a309082bf --- /dev/null +++ b/internal/api/client/trends/tags.go @@ -0,0 +1,57 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package trends + +import ( + "net/http" + + apiutil "code.superseriousbusiness.org/gotosocial/internal/api/util" + "code.superseriousbusiness.org/gotosocial/internal/gtserror" + "github.com/gin-gonic/gin" +) + +// TagsGETHandler swagger:operation GET /api/v1/trends/tags getTrendingTags +// +// View hashtags that are currently being used more frequently than usual. +// +// THIS ENDPOINT IS CURRENTLY NOT FULLY IMPLEMENTED: it will always return an empty array. +// +// --- +// tags: +// - trends +// +// produces: +// - application/json +// +// responses: +// '200': +// schema: +// type: array +// items: +// type: object +// maxItems: 0 +// '406': +// description: not acceptable +func (m *Module) TagsGETHandler(c *gin.Context) { + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, apiutil.EmptyJSONArray) +} diff --git a/internal/api/client/trends/trends.go b/internal/api/client/trends/trends.go new file mode 100644 index 000000000..056f00e31 --- /dev/null +++ b/internal/api/client/trends/trends.go @@ -0,0 +1,48 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package trends + +import ( + "net/http" + + "code.superseriousbusiness.org/gotosocial/internal/processing" + "github.com/gin-gonic/gin" +) + +const ( + BasePath = "/v1/trends" + TagsPath = BasePath + "/tags" + StatusesPath = BasePath + "/statuses" + LinksPath = BasePath + "/links" +) + +type Module struct { + processor *processing.Processor +} + +func New(processor *processing.Processor) *Module { + return &Module{ + processor: processor, + } +} + +func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) { + attachHandler(http.MethodGet, TagsPath, m.TagsGETHandler) + attachHandler(http.MethodGet, StatusesPath, m.StatusesGETHandler) + attachHandler(http.MethodGet, LinksPath, m.LinksGETHandler) +}