featured.go (2988B)
1 // GoToSocial 2 // Copyright (C) GoToSocial Authors admin@gotosocial.org 3 // SPDX-License-Identifier: AGPL-3.0-or-later 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package users 19 20 import ( 21 "encoding/json" 22 "errors" 23 "net/http" 24 "strings" 25 26 "github.com/gin-gonic/gin" 27 apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" 28 "github.com/superseriousbusiness/gotosocial/internal/gtserror" 29 ) 30 31 // FeaturedCollectionGETHandler swagger:operation GET /users/{username}/collections/featured s2sFeaturedCollectionGet 32 // 33 // Get the featured collection (pinned posts) for a user. 34 // 35 // The response will contain an ordered collection of Note URIs in the `items` property. 36 // 37 // It is up to the caller to dereference the provided Note URIs (or not, if they already have them cached). 38 // 39 // HTTP signature is required on the request. 40 // 41 // --- 42 // tags: 43 // - s2s/federation 44 // 45 // produces: 46 // - application/activity+json 47 // 48 // responses: 49 // '200': 50 // in: body 51 // schema: 52 // "$ref": "#/definitions/swaggerFeaturedCollection" 53 // '400': 54 // description: bad request 55 // '401': 56 // description: unauthorized 57 // '403': 58 // description: forbidden 59 // '404': 60 // description: not found 61 func (m *Module) FeaturedCollectionGETHandler(c *gin.Context) { 62 // usernames on our instance are always lowercase 63 requestedUsername := strings.ToLower(c.Param(UsernameKey)) 64 if requestedUsername == "" { 65 err := errors.New("no username specified in request") 66 apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) 67 return 68 } 69 70 format, err := apiutil.NegotiateAccept(c, apiutil.HTMLOrActivityPubHeaders...) 71 if err != nil { 72 apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) 73 return 74 } 75 76 if format == string(apiutil.TextHTML) { 77 // This isn't an ActivityPub request; 78 // redirect to the user's profile. 79 c.Redirect(http.StatusSeeOther, "/@"+requestedUsername) 80 return 81 } 82 83 resp, errWithCode := m.processor.Fedi().FeaturedCollectionGet(c.Request.Context(), requestedUsername) 84 if errWithCode != nil { 85 apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) 86 return 87 } 88 89 b, err := json.Marshal(resp) 90 if err != nil { 91 apiutil.ErrorHandler(c, gtserror.NewErrorInternalError(err), m.processor.InstanceGetV1) 92 return 93 } 94 95 c.Data(http.StatusOK, format, b) 96 }