diff options
| author | 2023-01-25 11:12:17 +0100 | |
|---|---|---|
| committer | 2023-01-25 11:12:17 +0100 | |
| commit | faeb7ded3b5d595910f424fd9cf9c6fe5935e648 (patch) | |
| tree | 5c50b950277ab985e73bfaf027b53ee82f4917a6 /internal/processing/admin | |
| parent | [chore] Settings refactor fix4 (#1383) (diff) | |
| download | gotosocial-faeb7ded3b5d595910f424fd9cf9c6fe5935e648.tar.xz | |
[feature] Implement reports admin API so admins can view + close reports (#1378)
* add admin report api endpoints + tests
* [chore] remove funky duplicate attachment in testrig
Diffstat (limited to 'internal/processing/admin')
| -rw-r--r-- | internal/processing/admin/admin.go | 3 | ||||
| -rw-r--r-- | internal/processing/admin/getreport.go | 45 | ||||
| -rw-r--r-- | internal/processing/admin/getreports.go | 92 | ||||
| -rw-r--r-- | internal/processing/admin/resolvereport.go | 64 | 
4 files changed, 204 insertions, 0 deletions
| diff --git a/internal/processing/admin/admin.go b/internal/processing/admin/admin.go index 861a1ee4a..b08b589bb 100644 --- a/internal/processing/admin/admin.go +++ b/internal/processing/admin/admin.go @@ -50,6 +50,9 @@ type Processor interface {  	EmojiCategoriesGet(ctx context.Context) ([]*apimodel.EmojiCategory, gtserror.WithCode)  	MediaPrune(ctx context.Context, mediaRemoteCacheDays int) gtserror.WithCode  	MediaRefetch(ctx context.Context, requestingAccount *gtsmodel.Account, domain string) gtserror.WithCode +	ReportsGet(ctx context.Context, account *gtsmodel.Account, resolved *bool, accountID string, targetAccountID string, maxID string, sinceID string, minID string, limit int) (*apimodel.PageableResponse, gtserror.WithCode) +	ReportGet(ctx context.Context, account *gtsmodel.Account, id string) (*apimodel.AdminReport, gtserror.WithCode) +	ReportResolve(ctx context.Context, account *gtsmodel.Account, id string, actionTakenComment *string) (*apimodel.AdminReport, gtserror.WithCode)  }  type processor struct { diff --git a/internal/processing/admin/getreport.go b/internal/processing/admin/getreport.go new file mode 100644 index 000000000..6c2f93935 --- /dev/null +++ b/internal/processing/admin/getreport.go @@ -0,0 +1,45 @@ +/* +   GoToSocial +   Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +package admin + +import ( +	"context" + +	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/db" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +func (p *processor) ReportGet(ctx context.Context, account *gtsmodel.Account, id string) (*apimodel.AdminReport, gtserror.WithCode) { +	report, err := p.db.GetReportByID(ctx, id) +	if err != nil { +		if err == db.ErrNoEntries { +			return nil, gtserror.NewErrorNotFound(err) +		} +		return nil, gtserror.NewErrorInternalError(err) +	} + +	apimodelReport, err := p.tc.ReportToAdminAPIReport(ctx, report, account) +	if err != nil { +		return nil, gtserror.NewErrorInternalError(err) +	} + +	return apimodelReport, nil +} diff --git a/internal/processing/admin/getreports.go b/internal/processing/admin/getreports.go new file mode 100644 index 000000000..fbc4b45b2 --- /dev/null +++ b/internal/processing/admin/getreports.go @@ -0,0 +1,92 @@ +/* +   GoToSocial +   Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +package admin + +import ( +	"context" +	"fmt" +	"strconv" + +	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/db" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +	"github.com/superseriousbusiness/gotosocial/internal/util" +) + +func (p *processor) ReportsGet( +	ctx context.Context, +	account *gtsmodel.Account, +	resolved *bool, +	accountID string, +	targetAccountID string, +	maxID string, +	sinceID string, +	minID string, +	limit int, +) (*apimodel.PageableResponse, gtserror.WithCode) { +	reports, err := p.db.GetReports(ctx, resolved, accountID, targetAccountID, maxID, sinceID, minID, limit) +	if err != nil { +		if err == db.ErrNoEntries { +			return util.EmptyPageableResponse(), nil +		} +		return nil, gtserror.NewErrorInternalError(err) +	} + +	count := len(reports) +	items := make([]interface{}, 0, count) +	nextMaxIDValue := "" +	prevMinIDValue := "" +	for i, r := range reports { +		item, err := p.tc.ReportToAdminAPIReport(ctx, r, account) +		if err != nil { +			return nil, gtserror.NewErrorInternalError(fmt.Errorf("error converting report to api: %s", err)) +		} + +		if i == count-1 { +			nextMaxIDValue = item.ID +		} + +		if i == 0 { +			prevMinIDValue = item.ID +		} + +		items = append(items, item) +	} + +	extraQueryParams := []string{} +	if resolved != nil { +		extraQueryParams = append(extraQueryParams, "resolved="+strconv.FormatBool(*resolved)) +	} +	if accountID != "" { +		extraQueryParams = append(extraQueryParams, "account_id="+accountID) +	} +	if targetAccountID != "" { +		extraQueryParams = append(extraQueryParams, "target_account_id="+targetAccountID) +	} + +	return util.PackagePageableResponse(util.PageableResponseParams{ +		Items:            items, +		Path:             "/api/v1/admin/reports", +		NextMaxIDValue:   nextMaxIDValue, +		PrevMinIDValue:   prevMinIDValue, +		Limit:            limit, +		ExtraQueryParams: extraQueryParams, +	}) +} diff --git a/internal/processing/admin/resolvereport.go b/internal/processing/admin/resolvereport.go new file mode 100644 index 000000000..5c1dca1b0 --- /dev/null +++ b/internal/processing/admin/resolvereport.go @@ -0,0 +1,64 @@ +/* +   GoToSocial +   Copyright (C) 2021-2023 GoToSocial Authors admin@gotosocial.org + +   This program is free software: you can redistribute it and/or modify +   it under the terms of the GNU Affero General Public License as published by +   the Free Software Foundation, either version 3 of the License, or +   (at your option) any later version. + +   This program is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +   GNU Affero General Public License for more details. + +   You should have received a copy of the GNU Affero General Public License +   along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +package admin + +import ( +	"context" +	"time" + +	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" +	"github.com/superseriousbusiness/gotosocial/internal/db" +	"github.com/superseriousbusiness/gotosocial/internal/gtserror" +	"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +func (p *processor) ReportResolve(ctx context.Context, account *gtsmodel.Account, id string, actionTakenComment *string) (*apimodel.AdminReport, gtserror.WithCode) { +	report, err := p.db.GetReportByID(ctx, id) +	if err != nil { +		if err == db.ErrNoEntries { +			return nil, gtserror.NewErrorNotFound(err) +		} +		return nil, gtserror.NewErrorInternalError(err) +	} + +	columns := []string{ +		"action_taken_at", +		"action_taken_by_account_id", +	} + +	report.ActionTakenAt = time.Now() +	report.ActionTakenByAccountID = account.ID + +	if actionTakenComment != nil { +		report.ActionTaken = *actionTakenComment +		columns = append(columns, "action_taken") +	} + +	updatedReport, err := p.db.UpdateReport(ctx, report, columns...) +	if err != nil { +		return nil, gtserror.NewErrorInternalError(err) +	} + +	apimodelReport, err := p.tc.ReportToAdminAPIReport(ctx, updatedReport, account) +	if err != nil { +		return nil, gtserror.NewErrorInternalError(err) +	} + +	return apimodelReport, nil +} | 
