mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-06-12 18:29:23 +00:00
[feature] statusSource endpoint
This commit is contained in:
parent
8cf685fbe9
commit
14b23b22ac
|
@ -249,3 +249,17 @@ const (
|
|||
StatusContentTypeMarkdown StatusContentType = "text/markdown"
|
||||
StatusContentTypeDefault = StatusContentTypePlain
|
||||
)
|
||||
|
||||
// StatusSource represents the source text of a
|
||||
// status as submitted to the API when it was created.
|
||||
//
|
||||
// swagger:model statusSource
|
||||
type StatusSource struct {
|
||||
// ID of the status.
|
||||
// example: 01FBVD42CQ3ZEEVMW180SBX03B
|
||||
ID string `json:"id"`
|
||||
// Plain-text source of a status.
|
||||
Text string `json:"source"`
|
||||
// Plain-text version of spoiler text.
|
||||
SpoilerText string `json:"spoiler_text"`
|
||||
}
|
||||
|
|
|
@ -41,6 +41,44 @@ func (p *Processor) Get(ctx context.Context, requestingAccount *gtsmodel.Account
|
|||
return p.c.GetAPIStatus(ctx, requestingAccount, targetStatus)
|
||||
}
|
||||
|
||||
// SourceGet returns the *apimodel.StatusSource version of the targetStatusID.
|
||||
// Status must belong to the requester, and must not be a boost.
|
||||
func (p *Processor) SourceGet(ctx context.Context, requestingAccount *gtsmodel.Account, targetStatusID string) (*apimodel.StatusSource, gtserror.WithCode) {
|
||||
targetStatus, errWithCode := p.c.GetVisibleTargetStatus(ctx,
|
||||
requestingAccount,
|
||||
targetStatusID,
|
||||
nil, // default freshness
|
||||
)
|
||||
if errWithCode != nil {
|
||||
return nil, errWithCode
|
||||
}
|
||||
|
||||
// Redirect to wrapped status if boost.
|
||||
targetStatus, errWithCode = p.c.UnwrapIfBoost(
|
||||
ctx,
|
||||
requestingAccount,
|
||||
targetStatus,
|
||||
)
|
||||
if errWithCode != nil {
|
||||
return nil, errWithCode
|
||||
}
|
||||
|
||||
if targetStatus.AccountID != requestingAccount.ID {
|
||||
err := gtserror.Newf(
|
||||
"status %s does not belong to account %s",
|
||||
targetStatusID, requestingAccount.ID,
|
||||
)
|
||||
return nil, gtserror.NewErrorNotFound(err)
|
||||
}
|
||||
|
||||
statusSource, err := p.converter.StatusToAPIStatusSource(ctx, targetStatus)
|
||||
if err != nil {
|
||||
err = gtserror.Newf("error converting status: %w", err)
|
||||
return nil, gtserror.NewErrorInternalError(err)
|
||||
}
|
||||
return statusSource, nil
|
||||
}
|
||||
|
||||
// WebGet gets the given status for web use, taking account of privacy settings.
|
||||
func (p *Processor) WebGet(ctx context.Context, targetStatusID string) (*apimodel.Status, gtserror.WithCode) {
|
||||
targetStatus, errWithCode := p.c.GetVisibleTargetStatus(ctx,
|
||||
|
|
|
@ -792,6 +792,17 @@ func (c *Converter) StatusToWebStatus(
|
|||
return webStatus, nil
|
||||
}
|
||||
|
||||
// StatusToAPIStatusSource returns the *apimodel.StatusSource of the given status.
|
||||
// Callers should check beforehand whether a requester has permission to view the
|
||||
// source of the status, and ensure they're passing only a local status into this function.
|
||||
func (c *Converter) StatusToAPIStatusSource(ctx context.Context, s *gtsmodel.Status) (*apimodel.StatusSource, error) {
|
||||
return &apimodel.StatusSource{
|
||||
ID: s.ID,
|
||||
Text: s.Text,
|
||||
SpoilerText: s.ContentWarning,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// statusToFrontend is a package internal function for
|
||||
// parsing a status into its initial frontend representation.
|
||||
//
|
||||
|
|
Loading…
Reference in a new issue