// GoToSocial // Copyright (C) GoToSocial Authors admin@gotosocial.org // SPDX-License-Identifier: AGPL-3.0-or-later // // 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 . package admin import ( "context" "errors" "fmt" "net/url" apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" "github.com/superseriousbusiness/gotosocial/internal/paging" ) func (p *Processor) DomainPermissionIgnoreCreate( ctx context.Context, acct *gtsmodel.Account, domain string, privateComment string, ) (*apimodel.DomainPermission, gtserror.WithCode) { permIgnore := >smodel.DomainPermissionIgnore{ ID: id.NewULID(), Domain: domain, CreatedByAccountID: acct.ID, CreatedByAccount: acct, PrivateComment: privateComment, } if err := p.state.DB.PutDomainPermissionIgnore(ctx, permIgnore); err != nil { if errors.Is(err, db.ErrAlreadyExists) { const text = "a domain permission ignore already exists with this permission type and domain" err := fmt.Errorf("%w: %s", err, text) return nil, gtserror.NewErrorConflict(err, text) } // Real error. err := gtserror.Newf("db error putting domain permission ignore: %w", err) return nil, gtserror.NewErrorInternalError(err) } return p.apiDomainPerm(ctx, permIgnore, false) } // DomainPermissionIgnoreGet returns one // domain permission ignore with the given id. func (p *Processor) DomainPermissionIgnoreGet( ctx context.Context, id string, ) (*apimodel.DomainPermission, gtserror.WithCode) { permIgnore, err := p.state.DB.GetDomainPermissionIgnoreByID(ctx, id) if err != nil && !errors.Is(err, db.ErrNoEntries) { err := gtserror.Newf("db error getting domain permission ignore %s: %w", id, err) return nil, gtserror.NewErrorInternalError(err) } if permIgnore == nil { err := fmt.Errorf("domain permission ignore %s not found", id) return nil, gtserror.NewErrorNotFound(err, err.Error()) } return p.apiDomainPerm(ctx, permIgnore, false) } // DomainPermissionIgnoresGet returns a page of // DomainPermissionIgnores with the given parameters. func (p *Processor) DomainPermissionIgnoresGet( ctx context.Context, domain string, page *paging.Page, ) (*apimodel.PageableResponse, gtserror.WithCode) { permIgnores, err := p.state.DB.GetDomainPermissionIgnores( ctx, domain, page, ) if err != nil && !errors.Is(err, db.ErrNoEntries) { err := gtserror.Newf("db error: %w", err) return nil, gtserror.NewErrorInternalError(err) } count := len(permIgnores) if count == 0 { return paging.EmptyResponse(), nil } // Get the lowest and highest // ID values, used for paging. lo := permIgnores[count-1].ID hi := permIgnores[0].ID // Convert each perm ignore to API model. items := make([]any, len(permIgnores)) for i, permIgnore := range permIgnores { apiPermIgnore, err := p.apiDomainPerm(ctx, permIgnore, false) if err != nil { return nil, gtserror.NewErrorInternalError(err) } items[i] = apiPermIgnore } // Assemble next/prev page queries. query := make(url.Values, 1) if domain != "" { query.Set(apiutil.DomainPermissionDomainKey, domain) } return paging.PackageResponse(paging.ResponseParams{ Items: items, Path: "/api/v1/admin/domain_permission_ignores", Next: page.Next(lo, hi), Prev: page.Prev(lo, hi), Query: query, }), nil }