1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
// 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 <http://www.gnu.org/licenses/>.
package account
import (
"context"
"errors"
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"
)
// ExportStats returns the requester's export stats,
// ie., the counts of items that can be exported.
func (p *Processor) ExportStats(
ctx context.Context,
requester *gtsmodel.Account,
) (*apimodel.AccountExportStats, gtserror.WithCode) {
exportStats, err := p.converter.AccountToExportStats(ctx, requester)
if err != nil {
err = gtserror.Newf("db error getting export stats: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
return exportStats, nil
}
// ExportFollowing returns a CSV file of
// accounts that the requester follows.
func (p *Processor) ExportFollowing(
ctx context.Context,
requester *gtsmodel.Account,
) ([][]string, gtserror.WithCode) {
// Fetch accounts followed by requester,
// using a nil page to get everything.
following, err := p.state.DB.GetAccountFollows(ctx, requester.ID, nil)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
err = gtserror.Newf("db error getting follows: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
// Convert accounts to CSV-compatible
// records, with appropriate column headers.
records, err := p.converter.FollowingToCSV(ctx, following)
if err != nil {
err = gtserror.Newf("error converting follows to records: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
return records, nil
}
// ExportFollowers returns a CSV file of
// accounts that follow the requester.
func (p *Processor) ExportFollowers(
ctx context.Context,
requester *gtsmodel.Account,
) ([][]string, gtserror.WithCode) {
// Fetch accounts following requester,
// using a nil page to get everything.
followers, err := p.state.DB.GetAccountFollowers(ctx, requester.ID, nil)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
err = gtserror.Newf("db error getting followers: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
// Convert accounts to CSV-compatible
// records, with appropriate column headers.
records, err := p.converter.FollowersToCSV(ctx, followers)
if err != nil {
err = gtserror.Newf("error converting followers to records: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
return records, nil
}
// ExportLists returns a CSV file of
// lists created by the requester.
func (p *Processor) ExportLists(
ctx context.Context,
requester *gtsmodel.Account,
) ([][]string, gtserror.WithCode) {
lists, err := p.state.DB.GetListsForAccountID(ctx, requester.ID)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
err = gtserror.Newf("db error getting lists: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
// Convert lists to CSV-compatible records.
records, err := p.converter.ListsToCSV(ctx, lists)
if err != nil {
err = gtserror.Newf("error converting lists to records: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
return records, nil
}
// ExportBlocks returns a CSV file of
// account blocks created by the requester.
func (p *Processor) ExportBlocks(
ctx context.Context,
requester *gtsmodel.Account,
) ([][]string, gtserror.WithCode) {
blocks, err := p.state.DB.GetAccountBlocks(ctx, requester.ID, nil)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
err = gtserror.Newf("db error getting blocks: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
// Convert blocks to CSV-compatible records.
records, err := p.converter.BlocksToCSV(ctx, blocks)
if err != nil {
err = gtserror.Newf("error converting blocks to records: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
return records, nil
}
// ExportMutes returns a CSV file of
// account mutes created by the requester.
func (p *Processor) ExportMutes(
ctx context.Context,
requester *gtsmodel.Account,
) ([][]string, gtserror.WithCode) {
mutes, err := p.state.DB.GetAccountMutes(ctx, requester.ID, nil)
if err != nil && !errors.Is(err, db.ErrNoEntries) {
err = gtserror.Newf("db error getting mutes: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
// Convert mutes to CSV-compatible records.
records, err := p.converter.MutesToCSV(ctx, mutes)
if err != nil {
err = gtserror.Newf("error converting mutes to records: %w", err)
return nil, gtserror.NewErrorInternalError(err)
}
return records, nil
}
|