diff options
author | 2023-08-19 14:33:15 +0200 | |
---|---|---|
committer | 2023-08-19 14:33:15 +0200 | |
commit | 92de8fb396265d057f18aab4de0bc8aff4b90188 (patch) | |
tree | 46438b9ff550261f56aa58d038cdf2f1e15493e3 /internal/typeutils | |
parent | [bugfix] fix double firing bun.DB query hooks (#2124) (diff) | |
download | gotosocial-92de8fb396265d057f18aab4de0bc8aff4b90188.tar.xz |
[feature] Instance rules (#2125)
* init instance rules database model, admin api
* expose instance rules in public instance api
* public /api/v1/instance/rules route
* GET ruleById
* createRule route
* createRule auth check
* updateRule
* deleteRule
* list rules on about page
* ruleGet auth
* add about page ids for anchors
* process and store adding violated rules to reports
* admin api models for instance rules
* instance rule edit frontend
* change rule inputs to textareas
* database fixes after rebase (#2124)
* remove unused imports
* fix db migration column name
* fix tests
* fix more tests
* fix postgres error with wrongly used Ident
* add some tests, fiddle with rule model a bit, fix postgres migration
* swagger docs
---------
Co-authored-by: tsmethurst <tobi.smethurst@protonmail.com>
Diffstat (limited to 'internal/typeutils')
-rw-r--r-- | internal/typeutils/converter.go | 4 | ||||
-rw-r--r-- | internal/typeutils/internaltofrontend.go | 47 | ||||
-rw-r--r-- | internal/typeutils/internaltofrontend_test.go | 24 |
3 files changed, 67 insertions, 8 deletions
diff --git a/internal/typeutils/converter.go b/internal/typeutils/converter.go index 73992fc0e..774b68157 100644 --- a/internal/typeutils/converter.go +++ b/internal/typeutils/converter.go @@ -83,6 +83,10 @@ type TypeConverter interface { InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Instance) (*apimodel.InstanceV1, error) // InstanceToAPIV2Instance converts a gts instance into its api equivalent for serving at /api/v2/instance InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Instance) (*apimodel.InstanceV2, error) + // InstanceRulesToAPIRules converts all local instance rules into their api equivalent for serving at /api/v1/instance/rules + InstanceRulesToAPIRules(r []gtsmodel.Rule) []apimodel.InstanceRule + // InstanceRuleToAdminAPIRule converts a local instance rule into its api equivalent for serving at /api/v1/admin/instance/rules/:id + InstanceRuleToAdminAPIRule(r *gtsmodel.Rule) *apimodel.AdminInstanceRule // RelationshipToAPIRelationship converts a gts relationship into its api equivalent for serving in various places RelationshipToAPIRelationship(ctx context.Context, r *gtsmodel.Relationship) (*apimodel.Relationship, error) // NotificationToAPINotification converts a gts notification into a api notification diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index ab04f6ccc..050997bda 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -738,6 +738,32 @@ func (c *converter) VisToAPIVis(ctx context.Context, m gtsmodel.Visibility) apim return "" } +func (c *converter) InstanceRuleToAPIRule(r gtsmodel.Rule) apimodel.InstanceRule { + return apimodel.InstanceRule{ + ID: r.ID, + Text: r.Text, + } +} + +func (c *converter) InstanceRulesToAPIRules(r []gtsmodel.Rule) []apimodel.InstanceRule { + rules := make([]apimodel.InstanceRule, len(r)) + + for i, v := range r { + rules[i] = c.InstanceRuleToAPIRule(v) + } + + return rules +} + +func (c *converter) InstanceRuleToAdminAPIRule(r *gtsmodel.Rule) *apimodel.AdminInstanceRule { + return &apimodel.AdminInstanceRule{ + ID: r.ID, + CreatedAt: util.FormatISO8601(r.CreatedAt), + UpdatedAt: util.FormatISO8601(r.UpdatedAt), + Text: r.Text, + } +} + func (c *converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Instance) (*apimodel.InstanceV1, error) { instance := &apimodel.InstanceV1{ URI: i.URI, @@ -752,6 +778,7 @@ func (c *converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins ApprovalRequired: config.GetAccountsApprovalRequired(), InvitesEnabled: false, // todo: not supported yet MaxTootChars: uint(config.GetStatusesMaxChars()), + Rules: c.InstanceRulesToAPIRules(i.Rules), } if config.GetInstanceInjectMastodonVersion() { @@ -854,7 +881,7 @@ func (c *converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins Description: i.Description, Usage: apimodel.InstanceV2Usage{}, // todo: not implemented Languages: []string{}, // todo: not implemented - Rules: []interface{}{}, // todo: not implemented + Rules: c.InstanceRulesToAPIRules(i.Rules), } if config.GetInstanceInjectMastodonVersion() { @@ -1051,7 +1078,7 @@ func (c *converter) ReportToAPIReport(ctx context.Context, r *gtsmodel.Report) ( Comment: r.Comment, Forwarded: *r.Forwarded, StatusIDs: r.StatusIDs, - RuleIDs: []int{}, // todo: not supported yet + RuleIDs: r.RuleIDs, } if !r.ActionTakenAt.IsZero() { @@ -1144,6 +1171,20 @@ func (c *converter) ReportToAdminAPIReport(ctx context.Context, r *gtsmodel.Repo statuses = append(statuses, status) } + rules := make([]*apimodel.InstanceRule, 0, len(r.RuleIDs)) + if len(r.RuleIDs) != 0 && len(r.Rules) == 0 { + r.Rules, err = c.db.GetRulesByIDs(ctx, r.RuleIDs) + if err != nil { + return nil, fmt.Errorf("ReportToAdminAPIReport: error getting rules from the db: %w", err) + } + } + for _, v := range r.Rules { + rules = append(rules, &apimodel.InstanceRule{ + ID: v.ID, + Text: v.Text, + }) + } + if ac := r.ActionTaken; ac != "" { actionTakenComment = &ac } @@ -1163,7 +1204,7 @@ func (c *converter) ReportToAdminAPIReport(ctx context.Context, r *gtsmodel.Repo ActionTakenByAccount: actionTakenByAccount, ActionTakenComment: actionTakenComment, Statuses: statuses, - Rules: []interface{}{}, // not implemented + Rules: rules, }, nil } diff --git a/internal/typeutils/internaltofrontend_test.go b/internal/typeutils/internaltofrontend_test.go index d99a31e25..9f72c6d2e 100644 --- a/internal/typeutils/internaltofrontend_test.go +++ b/internal/typeutils/internaltofrontend_test.go @@ -603,6 +603,7 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV1ToFrontend() { b, err := json.MarshalIndent(instance, "", " ") suite.NoError(err) + // FIXME: "rules" is empty from the database, because it's not fetched through db.GetInstance suite.Equal(`{ "uri": "http://localhost:8080", "account_domain": "localhost:8080", @@ -689,7 +690,8 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV1ToFrontend() { "name": "admin" } }, - "max_toot_chars": 5000 + "max_toot_chars": 5000, + "rules": [] }`, string(b)) } @@ -887,7 +889,10 @@ func (suite *InternalToFrontendTestSuite) TestReportToFrontend1() { "status_ids": [ "01FVW7JHQFSFK166WWKR8CBA6M" ], - "rule_ids": [], + "rule_ids": [ + "01GP3AWY4CRDVRNZKW0TEAMB51", + "01GP3DFY9XQ1TJMZT5BGAZPXX3" + ], "target_account": { "id": "01F8MH5ZK5VRH73AKHQM6Y9VNX", "username": "foss_satan", @@ -1177,7 +1182,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend1() { "created_by_application_id": "01F8MGXQRHYF5QPMTMXP78QC2F" }, "statuses": [], - "rule_ids": [], + "rules": [], "action_taken_comment": "user was warned not to be a turtle anymore" }`, string(b)) } @@ -1380,7 +1385,16 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontend2() { "poll": null } ], - "rule_ids": [], + "rules": [ + { + "id": "01GP3AWY4CRDVRNZKW0TEAMB51", + "text": "Be gay" + }, + { + "id": "01GP3DFY9XQ1TJMZT5BGAZPXX3", + "text": "Do crime" + } + ], "action_taken_comment": null }`, string(b)) } @@ -1603,7 +1617,7 @@ func (suite *InternalToFrontendTestSuite) TestAdminReportToFrontendSuspendedLoca "created_by_application_id": "01F8MGXQRHYF5QPMTMXP78QC2F" }, "statuses": [], - "rule_ids": [], + "rules": [], "action_taken_comment": "user was warned not to be a turtle anymore" }`, string(b)) } |