diff options
Diffstat (limited to 'internal/db')
-rw-r--r-- | internal/db/db.go | 8 | ||||
-rw-r--r-- | internal/db/pg/instancestats.go | 52 |
2 files changed, 60 insertions, 0 deletions
diff --git a/internal/db/db.go b/internal/db/db.go index 4e21358c3..204f04c71 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -253,6 +253,14 @@ type DB interface { // GetNotificationsForAccount returns a list of notifications that pertain to the given accountID. GetNotificationsForAccount(accountID string, limit int, maxID string, sinceID string) ([]*gtsmodel.Notification, error) + // GetUserCountForInstance returns the number of known accounts registered with the given domain. + GetUserCountForInstance(domain string) (int, error) + + // GetStatusCountForInstance returns the number of known statuses posted from the given domain. + GetStatusCountForInstance(domain string) (int, error) + + // GetDomainCountForInstance returns the number of known instances known that the given domain federates with. + GetDomainCountForInstance(domain string) (int, error) /* USEFUL CONVERSION FUNCTIONS */ diff --git a/internal/db/pg/instancestats.go b/internal/db/pg/instancestats.go new file mode 100644 index 000000000..b57591d7b --- /dev/null +++ b/internal/db/pg/instancestats.go @@ -0,0 +1,52 @@ +package pg + +import ( + "github.com/go-pg/pg/v10" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +func (ps *postgresService) GetUserCountForInstance(domain string) (int, error) { + q := ps.conn.Model(&[]*gtsmodel.Account{}) + + if domain == ps.config.Host { + // if the domain is *this* domain, just count where the domain field is null + q = q.Where("? IS NULL", pg.Ident("domain")) + } else { + q = q.Where("domain = ?", domain) + } + + // don't count the instance account or suspended users + q = q.Where("username != ?", domain).Where("? IS NULL", pg.Ident("suspended_at")) + + return q.Count() +} + +func (ps *postgresService) GetStatusCountForInstance(domain string) (int, error) { + q := ps.conn.Model(&[]*gtsmodel.Status{}) + + if domain == ps.config.Host { + // if the domain is *this* domain, just count where local is true + q = q.Where("local = ?", true) + } else { + // join on the domain of the account + q = q.Join("JOIN accounts AS account ON account.id = status.account_id"). + Where("account.domain = ?", domain) + } + + return q.Count() +} + +func (ps *postgresService) GetDomainCountForInstance(domain string) (int, error) { + q := ps.conn.Model(&[]*gtsmodel.Instance{}) + + if domain == ps.config.Host { + // if the domain is *this* domain, just count other instances it knows about + // TODO: exclude domains that are blocked or silenced + q = q.Where("domain != ?", domain) + } else { + // TODO: implement federated domain counting properly for remote domains + return 0, nil + } + + return q.Count() +} |