summaryrefslogtreecommitdiff
path: root/internal/typeutils
diff options
context:
space:
mode:
authorLibravatar f0x52 <f0x@cthu.lu>2023-08-19 14:33:15 +0200
committerLibravatar GitHub <noreply@github.com>2023-08-19 14:33:15 +0200
commit92de8fb396265d057f18aab4de0bc8aff4b90188 (patch)
tree46438b9ff550261f56aa58d038cdf2f1e15493e3 /internal/typeutils
parent[bugfix] fix double firing bun.DB query hooks (#2124) (diff)
downloadgotosocial-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.go4
-rw-r--r--internal/typeutils/internaltofrontend.go47
-rw-r--r--internal/typeutils/internaltofrontend_test.go24
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))
}