mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 09:52:26 -05:00 
			
		
		
		
	[bugfix/docs] Poll api fixups + swagger docs (#2345)
This commit is contained in:
		
					parent
					
						
							
								b1c65ed9ac
							
						
					
				
			
			
				commit
				
					
						42a19cf390
					
				
			
		
					 5 changed files with 93 additions and 14 deletions
				
			
		|  | @ -2020,14 +2020,21 @@ definitions: | |||
|                 type: array | ||||
|                 x-go-name: Options | ||||
|             own_votes: | ||||
|                 description: When called with a user token, which options has the authorized user chosen? Contains an array of index values for options. | ||||
|                 description: |- | ||||
|                     When called with a user token, which options has the authorized | ||||
|                     user chosen? Contains an array of index values for options. | ||||
| 
 | ||||
|                     Omitted when no user token provided. | ||||
|                 items: | ||||
|                     format: int64 | ||||
|                     type: integer | ||||
|                 type: array | ||||
|                 x-go-name: OwnVotes | ||||
|             voted: | ||||
|                 description: When called with a user token, has the authorized user voted? | ||||
|                 description: |- | ||||
|                     When called with a user token, has the authorized user voted? | ||||
| 
 | ||||
|                     Omitted when no user token provided. | ||||
|                 type: boolean | ||||
|                 x-go-name: Voted | ||||
|             voters_count: | ||||
|  | @ -2059,6 +2066,36 @@ definitions: | |||
|         type: object | ||||
|         x-go-name: PollOption | ||||
|         x-go-package: github.com/superseriousbusiness/gotosocial/internal/api/model | ||||
|     pollRequest: | ||||
|         properties: | ||||
|             expires_in: | ||||
|                 description: |- | ||||
|                     Duration the poll should be open, in seconds. | ||||
|                     If provided, media_ids cannot be used, and poll[options] must be provided. | ||||
|                 format: int64 | ||||
|                 type: integer | ||||
|                 x-go-name: ExpiresIn | ||||
|             hide_totals: | ||||
|                 description: Hide vote counts until the poll ends. | ||||
|                 type: boolean | ||||
|                 x-go-name: HideTotals | ||||
|             multiple: | ||||
|                 description: Allow multiple choices on this poll. | ||||
|                 type: boolean | ||||
|                 x-go-name: Multiple | ||||
|             options: | ||||
|                 description: |- | ||||
|                     Array of possible answers. | ||||
|                     If provided, media_ids cannot be used, and poll[expires_in] must be provided. | ||||
|                     name: poll[options] | ||||
|                 items: | ||||
|                     type: string | ||||
|                 type: array | ||||
|                 x-go-name: Options | ||||
|         title: PollRequest models a request to create a poll. | ||||
|         type: object | ||||
|         x-go-name: PollRequest | ||||
|         x-go-package: github.com/superseriousbusiness/gotosocial/internal/api/model | ||||
|     report: | ||||
|         properties: | ||||
|             action_taken: | ||||
|  | @ -2346,6 +2383,8 @@ definitions: | |||
|                     type: string | ||||
|                 type: array | ||||
|                 x-go-name: MediaIDs | ||||
|             poll: | ||||
|                 $ref: '#/definitions/pollRequest' | ||||
|             scheduled_at: | ||||
|                 description: |- | ||||
|                     ISO 8601 Datetime at which to schedule a status. | ||||
|  | @ -6028,13 +6067,20 @@ paths: | |||
|                 - polls | ||||
|     /api/v1/polls/{id}/vote: | ||||
|         post: | ||||
|             operationId: poll | ||||
|             operationId: pollVote | ||||
|             parameters: | ||||
|                 - description: Target poll ID. | ||||
|                   in: path | ||||
|                   name: id | ||||
|                   required: true | ||||
|                   type: string | ||||
|                 - description: Poll choice indices on which to vote. | ||||
|                   in: formData | ||||
|                   items: | ||||
|                     type: integer | ||||
|                   name: choices | ||||
|                   required: true | ||||
|                   type: array | ||||
|             produces: | ||||
|                 - application/json | ||||
|             responses: | ||||
|  | @ -6309,6 +6355,11 @@ paths: | |||
|                   name: media_ids | ||||
|                   type: array | ||||
|                   x-go-name: MediaIDs | ||||
|                 - $ref: '#/definitions/pollRequest' | ||||
|                   description: Poll to include with this status. | ||||
|                   in: formData | ||||
|                   name: poll | ||||
|                   x-go-name: Poll | ||||
|                 - description: ID of the status being replied to, if status is a reply. | ||||
|                   in: formData | ||||
|                   name: in_reply_to_id | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ import ( | |||
| 	"github.com/superseriousbusiness/gotosocial/internal/oauth" | ||||
| ) | ||||
| 
 | ||||
| // PollVotePOSTHandler swagger:operation POST /api/v1/polls/{id}/vote poll | ||||
| // PollVotePOSTHandler swagger:operation POST /api/v1/polls/{id}/vote pollVote | ||||
| // | ||||
| // Vote with choices in the given poll. | ||||
| // | ||||
|  | @ -45,6 +45,14 @@ import ( | |||
| //		description: Target poll ID. | ||||
| //		in: path | ||||
| //		required: true | ||||
| //	- | ||||
| //		name: choices | ||||
| //		type: array | ||||
| //		items: | ||||
| //			type: integer | ||||
| //		description: Poll choice indices on which to vote. | ||||
| //		in: formData | ||||
| //		required: true | ||||
| // | ||||
| //	security: | ||||
| //	- OAuth2 Bearer: | ||||
|  |  | |||
|  | @ -41,10 +41,15 @@ type Poll struct { | |||
| 	VotersCount int `json:"voters_count"` | ||||
| 
 | ||||
| 	// When called with a user token, has the authorized user voted? | ||||
| 	Voted bool `json:"voted,omitempty"` | ||||
| 	// | ||||
| 	// Omitted when no user token provided. | ||||
| 	Voted *bool `json:"voted,omitempty"` | ||||
| 
 | ||||
| 	// When called with a user token, which options has the authorized user chosen? Contains an array of index values for options. | ||||
| 	OwnVotes []int `json:"own_votes,omitempty"` | ||||
| 	// When called with a user token, which options has the authorized | ||||
| 	// user chosen? Contains an array of index values for options. | ||||
| 	// | ||||
| 	// Omitted when no user token provided. | ||||
| 	OwnVotes *[]int `json:"own_votes,omitempty"` | ||||
| 
 | ||||
| 	// Possible answers for the poll. | ||||
| 	Options []PollOption `json:"options"` | ||||
|  | @ -66,7 +71,7 @@ type PollOption struct { | |||
| 
 | ||||
| // PollRequest models a request to create a poll. | ||||
| // | ||||
| // swagger:parameters createStatus | ||||
| // swagger:model pollRequest | ||||
| type PollRequest struct { | ||||
| 	// Array of possible answers. | ||||
| 	// If provided, media_ids cannot be used, and poll[expires_in] must be provided. | ||||
|  | @ -86,7 +91,7 @@ type PollRequest struct { | |||
| 
 | ||||
| // PollVoteRequest models a request to vote in a poll. | ||||
| // | ||||
| // swagger:parameters pollVote | ||||
| // swagger:ignore | ||||
| type PollVoteRequest struct { | ||||
| 	// Choices contains poll vote choice indices. Note that form | ||||
| 	// uses a different key than the JSON, i.e. the '[]' suffix. | ||||
|  |  | |||
|  | @ -155,7 +155,7 @@ type StatusCreateRequest struct { | |||
| 	// in: formData | ||||
| 	MediaIDs []string `form:"media_ids[]" json:"media_ids" xml:"media_ids"` | ||||
| 	// Poll to include with this status. | ||||
| 	// swagger:ignore | ||||
| 	// in: formData | ||||
| 	Poll *PollRequest `form:"poll" json:"poll" xml:"poll"` | ||||
| 	// ID of the status being replied to, if status is a reply. | ||||
| 	// in: formData | ||||
|  |  | |||
|  | @ -1313,8 +1313,10 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou | |||
| 		options     []apimodel.PollOption | ||||
| 		totalVotes  int | ||||
| 		totalVoters int | ||||
| 		ownChoices  []int | ||||
| 		voted       *bool | ||||
| 		ownChoices  *[]int | ||||
| 		isAuthor    bool | ||||
| 		emojis      []apimodel.Emoji | ||||
| 	) | ||||
| 
 | ||||
| 	// Preallocate a slice of frontend model poll choices. | ||||
|  | @ -1337,19 +1339,26 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou | |||
| 
 | ||||
| 		if vote != nil { | ||||
| 			// Set choices by requester. | ||||
| 			ownChoices = vote.Choices | ||||
| 			ownChoices = &vote.Choices | ||||
| 
 | ||||
| 			// Update default totals in the | ||||
| 			// case that counts are hidden. | ||||
| 			totalVotes = len(vote.Choices) | ||||
| 			totalVoters = 1 | ||||
| 			for _, choice := range ownChoices { | ||||
| 			for _, choice := range *ownChoices { | ||||
| 				options[choice].VotesCount++ | ||||
| 			} | ||||
| 		} else { | ||||
| 			// Requester is defined but hasn't made | ||||
| 			// a choice. Init slice to serialize as `[]`. | ||||
| 			ownChoices = util.Ptr(make([]int, 0)) | ||||
| 		} | ||||
| 
 | ||||
| 		// Check if requester is author of source status. | ||||
| 		isAuthor = (requester.ID == poll.Status.AccountID) | ||||
| 
 | ||||
| 		// Requester is defined so voted should be defined too. | ||||
| 		voted = util.Ptr((isAuthor || len(*ownChoices) > 0)) | ||||
| 	} | ||||
| 
 | ||||
| 	if isAuthor || !*poll.HideCounts { | ||||
|  | @ -1368,6 +1377,11 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO: emojis used in poll options. | ||||
| 	// For now init to empty slice to serialize as `[]`. | ||||
| 	// In future inherit from parent status. | ||||
| 	emojis = make([]apimodel.Emoji, 0) | ||||
| 
 | ||||
| 	return &apimodel.Poll{ | ||||
| 		ID:          poll.ID, | ||||
| 		ExpiresAt:   util.FormatISO8601(poll.ExpiresAt), | ||||
|  | @ -1375,9 +1389,10 @@ func (c *Converter) PollToAPIPoll(ctx context.Context, requester *gtsmodel.Accou | |||
| 		Multiple:    (*poll.Multiple), | ||||
| 		VotesCount:  totalVotes, | ||||
| 		VotersCount: totalVoters, | ||||
| 		Voted:       (isAuthor || len(ownChoices) > 0), | ||||
| 		Voted:       voted, | ||||
| 		OwnVotes:    ownChoices, | ||||
| 		Options:     options, | ||||
| 		Emojis:      emojis, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue