kopia lustrzana https://github.com/cloudflare/wildebeest
rodzic
2e30352821
commit
0f2d29ba5e
|
|
@ -2,7 +2,7 @@
|
|||
export const instanceStatisticsQuery = (origin: string): string => {
|
||||
return `
|
||||
SELECT
|
||||
(SELECT count(1) FROM actors WHERE type IN ('Person', 'Service') AND id LIKE '${origin}/ap/users/%') AS user_count,
|
||||
(SELECT count(1) FROM actors WHERE type IN ('Person', 'Service') AND id LIKE '%${origin}/ap/users/%') AS user_count,
|
||||
(SELECT count(1) FROM objects WHERE local = 1 AND type = 'Note') AS status_count,
|
||||
(SELECT count(1) FROM peers) + 1 AS domain_count
|
||||
;
|
||||
|
|
|
|||
|
|
@ -4,129 +4,149 @@ import type { Env } from 'wildebeest/backend/src/types/env'
|
|||
import * as v1_instance from 'wildebeest/functions/api/v1/instance'
|
||||
import * as v2_instance from 'wildebeest/functions/api/v2/instance'
|
||||
import * as peers from 'wildebeest/functions/api/v1/instance/peers'
|
||||
import { makeDB, assertCORS, assertJSON } from '../utils'
|
||||
import { makeDB, assertCORS, assertJSON } from 'wildebeest/backend/test/utils'
|
||||
import { createPerson } from 'wildebeest/backend/src/activitypub/actors'
|
||||
import { MastodonInstance } from 'wildebeest/backend/src/types/instance'
|
||||
import { createPublicNote } from 'wildebeest/backend/src/activitypub/objects/note'
|
||||
import { MastodonInstance, InstanceStatistics } from 'wildebeest/backend/src/types/instance'
|
||||
|
||||
const adminKEK = 'admin'
|
||||
const userKEK = 'test_kek2'
|
||||
const admin_email = 'admin@cloudflare.com'
|
||||
const domain = 'cloudflare.com'
|
||||
|
||||
describe('Mastodon APIs', () => {
|
||||
describe('instance', () => {
|
||||
type Data = {
|
||||
rules: unknown[]
|
||||
uri: string
|
||||
title: string
|
||||
email: string
|
||||
description: string
|
||||
version: string
|
||||
domain: string
|
||||
contact: { email: string }
|
||||
}
|
||||
|
||||
test('returns peers', async () => {
|
||||
const db = await makeDB()
|
||||
await addPeer(db, 'a')
|
||||
await addPeer(db, 'b')
|
||||
|
||||
const res = await peers.handleRequest(db)
|
||||
assert.equal(res.status, 200)
|
||||
|
||||
const data = await res.json<Array<string>>()
|
||||
assert.equal(data.length, 2)
|
||||
assert.equal(data[0], 'a')
|
||||
assert.equal(data[1], 'b')
|
||||
})
|
||||
|
||||
test('return the correct instance admin', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
describe('/v1', () => {
|
||||
describe('/instance', () => {
|
||||
const env = {
|
||||
INSTANCE_TITLE: 'a',
|
||||
ADMIN_EMAIL: admin_email,
|
||||
INSTANCE_DESCR: 'c',
|
||||
} as Env
|
||||
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
test('return the correct instance admin', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
{
|
||||
const data = await res.json<MastodonInstance>()
|
||||
assert.equal(data.email, admin_email)
|
||||
assert.equal(data?.contact_account?.acct, adminKEK)
|
||||
}
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
|
||||
{
|
||||
const data = await res.json<MastodonInstance>()
|
||||
assert.equal(data.email, admin_email)
|
||||
assert.equal(data?.contact_account?.acct, adminKEK)
|
||||
}
|
||||
})
|
||||
|
||||
test('return the correct instance statistics', async () => {
|
||||
const db = await makeDB()
|
||||
const person = await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
await createPerson(domain, db, userKEK, 'sven@cloudflare.com')
|
||||
await addPeer(db, 'a')
|
||||
await addPeer(db, 'b')
|
||||
await createPublicNote(domain, db, 'my first status', person)
|
||||
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
|
||||
{
|
||||
const data = await res.json<MastodonInstance>()
|
||||
assert.equal(data.stats?.user_count, 2)
|
||||
assert.equal(data.stats?.status_count, 1)
|
||||
assert.equal(data.stats?.domain_count, 3)
|
||||
}
|
||||
})
|
||||
|
||||
test('return the instance info', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
|
||||
{
|
||||
const data = await res.json<MastodonInstance>()
|
||||
assert.equal(data.rules?.length, 0)
|
||||
assert.equal(data.uri, domain)
|
||||
assert.equal(data.title, 'a')
|
||||
assert.equal(data.email, admin_email)
|
||||
assert.equal(data.description, 'c')
|
||||
assert(data.version?.includes('Wildebeest'))
|
||||
}
|
||||
})
|
||||
|
||||
test('adds a short_description if missing v1', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
|
||||
{
|
||||
const data = await res.json<any>()
|
||||
assert.equal(data.short_description, 'c')
|
||||
}
|
||||
})
|
||||
|
||||
describe('/peers', () => {
|
||||
test('returns peers', async () => {
|
||||
const db = await makeDB()
|
||||
await addPeer(db, 'a')
|
||||
await addPeer(db, 'b')
|
||||
|
||||
const res = await peers.handleRequest(db)
|
||||
assert.equal(res.status, 200)
|
||||
|
||||
const data = await res.json<Array<string>>()
|
||||
assert.equal(data.length, 2)
|
||||
assert.equal(data[0], 'a')
|
||||
assert.equal(data[1], 'b')
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
test('return the instance infos v1', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
const env = {
|
||||
INSTANCE_TITLE: 'a',
|
||||
ADMIN_EMAIL: 'b',
|
||||
INSTANCE_DESCR: 'c',
|
||||
} as Env
|
||||
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
|
||||
{
|
||||
const data = await res.json<Data>()
|
||||
assert.equal(data.rules.length, 0)
|
||||
assert.equal(data.uri, domain)
|
||||
assert.equal(data.title, 'a')
|
||||
assert.equal(data.email, 'b')
|
||||
assert.equal(data.description, 'c')
|
||||
assert(data.version.includes('Wildebeest'))
|
||||
})
|
||||
describe('/v2', () => {
|
||||
describe('/instance', () => {
|
||||
type Data = {
|
||||
rules: unknown[]
|
||||
uri: string
|
||||
title: string
|
||||
email: string
|
||||
description: string
|
||||
version: string
|
||||
domain: string
|
||||
contact: { email: string }
|
||||
}
|
||||
})
|
||||
|
||||
test('adds a short_description if missing v1', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
test('return the instance infos v2', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
const env = {
|
||||
INSTANCE_DESCR: 'c',
|
||||
} as Env
|
||||
const env = {
|
||||
INSTANCE_TITLE: 'a',
|
||||
ADMIN_EMAIL: 'b',
|
||||
INSTANCE_DESCR: 'c',
|
||||
} as Env
|
||||
const res = await v2_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
|
||||
const res = await v1_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
|
||||
{
|
||||
const data = await res.json<any>()
|
||||
assert.equal(data.short_description, 'c')
|
||||
}
|
||||
})
|
||||
|
||||
test('return the instance infos v2', async () => {
|
||||
const db = await makeDB()
|
||||
await createPerson(domain, db, adminKEK, admin_email, {}, true)
|
||||
|
||||
const env = {
|
||||
INSTANCE_TITLE: 'a',
|
||||
ADMIN_EMAIL: 'b',
|
||||
INSTANCE_DESCR: 'c',
|
||||
} as Env
|
||||
const res = await v2_instance.handleRequest(domain, db, env)
|
||||
assert.equal(res.status, 200)
|
||||
assertCORS(res)
|
||||
assertJSON(res)
|
||||
|
||||
{
|
||||
const data = await res.json<Data>()
|
||||
assert.equal(data.rules.length, 0)
|
||||
assert.equal(data.domain, domain)
|
||||
assert.equal(data.title, 'a')
|
||||
assert.equal(data.contact.email, 'b')
|
||||
assert.equal(data.description, 'c')
|
||||
assert(data.version.includes('Wildebeest'))
|
||||
}
|
||||
{
|
||||
const data = await res.json<Data>()
|
||||
assert.equal(data.rules.length, 0)
|
||||
assert.equal(data.domain, domain)
|
||||
assert.equal(data.title, 'a')
|
||||
assert.equal(data.contact.email, 'b')
|
||||
assert.equal(data.description, 'c')
|
||||
assert(data.version.includes('Wildebeest'))
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
// https://docs.joinmastodon.org/methods/instance/
|
||||
import type { Env } from 'wildebeest/backend/src/types/env'
|
||||
import { cors } from 'wildebeest/backend/src/utils/cors'
|
||||
import * as error from '../../../backend/src/errors'
|
||||
import * as error from 'wildebeest/backend/src/errors'
|
||||
import { DEFAULT_THUMBNAIL } from 'wildebeest/backend/src/config'
|
||||
import { getVersion } from '../../../config/versions'
|
||||
import { getVersion } from 'wildebeest/config/versions'
|
||||
import { calculateInstanceStatistics } from 'wildebeest/backend/src/mastodon/instance'
|
||||
import { MastodonInstance, InstanceStatistics } from '../../../backend/src/types/instance'
|
||||
import { MastodonAccount } from '../../../backend/src/types/account'
|
||||
import { loadLocalMastodonAccount } from '../../../backend/src/mastodon/account'
|
||||
import { MastodonInstance, InstanceStatistics } from 'wildebeest/backend/src/types/instance'
|
||||
import { MastodonAccount } from 'wildebeest/backend/src/types/account'
|
||||
import { loadLocalMastodonAccount } from 'wildebeest/backend/src/mastodon/account'
|
||||
import { Database, getDatabase } from 'wildebeest/backend/src/database'
|
||||
import { getAdmins } from '../wb/settings/server/admins'
|
||||
import { Actor, emailSymbol, Person } from '../../../backend/src/activitypub/actors'
|
||||
import { APObject } from '../../../backend/src/activitypub/objects'
|
||||
import { getAdmins } from 'wildebeest/functions/api/wb/settings/server/admins'
|
||||
import { Actor, emailSymbol, Person } from 'wildebeest/backend/src/activitypub/actors'
|
||||
import { APObject } from 'wildebeest/backend/src/activitypub/objects'
|
||||
|
||||
export const onRequest: PagesFunction<Env, any> = async ({ env, request }) => {
|
||||
const domain: string = new URL(request.url).hostname
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue