feat: productionize learning engine and classroom

This commit is contained in:
inman
2026-08-16 21:44:52 +08:00
parent 2d04197f3f
commit ba35adfbfa
124 changed files with 9071 additions and 796 deletions

View File

@@ -81,7 +81,7 @@ describe('embedded persistence route', () => {
}));
vi.stubEnv('DATABASE_URL', 'postgres://retry-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const request = () =>
new Request('http://localhost/api/persistence/runtime/sessions', {
headers: { authorization: 'Bearer test-token' },
@@ -103,7 +103,7 @@ describe('embedded persistence route', () => {
// Next dev HMR reloads module code but retains globalThis. The initialized
// handler must be reused rather than opening another pool.
vi.resetModules();
const reloaded = await import('@/app/api/persistence/[...path]/route');
const reloaded = await import('@/lib/persistence/http-route');
const hmrPoolFactory = vi.fn();
const afterReload = await reloaded.handlePersistenceRequest(request(), {
poolFactory: hmrPoolFactory,
@@ -179,7 +179,7 @@ describe('embedded persistence route', () => {
});
vi.stubEnv('DATABASE_URL', 'postgres://asset-wiring-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const pool = { end: vi.fn().mockResolvedValue(undefined) };
const response = await handlePersistenceRequest(
@@ -272,7 +272,7 @@ describe('embedded persistence route', () => {
vi.stubEnv('DATABASE_URL', 'postgres://asset-s3-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
vi.stubEnv('ASSET_S3_BUCKET', ' asset-bucket ');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const response = await handlePersistenceRequest(
new Request('http://localhost/api/persistence/assets', {
@@ -346,7 +346,7 @@ describe('embedded persistence route', () => {
vi.stubEnv('DATABASE_URL', 'postgres://invalid-s3-bucket-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
vi.stubEnv('ASSET_S3_BUCKET', 'Invalid_Bucket');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const poolFactory = vi.fn(() => ({ end: vi.fn().mockResolvedValue(undefined) }));
// The malformed bucket no longer gates handler initialization: document
@@ -417,7 +417,7 @@ describe('embedded persistence route', () => {
vi.stubEnv('DATABASE_URL', 'postgres://asset-s3-retry-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
vi.stubEnv('ASSET_S3_BUCKET', 'asset-bucket');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const response = await handlePersistenceRequest(
new Request('http://localhost/api/persistence/runtime/sessions', {
@@ -481,7 +481,7 @@ describe('embedded persistence route', () => {
vi.stubEnv('DATABASE_URL', 'postgres://validator-wiring-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
const [{ handlePersistenceRequest }, { APP_RUNTIME_PAYLOAD_VALIDATORS }] = await Promise.all([
import('@/app/api/persistence/[...path]/route'),
import('@/lib/persistence/http-route'),
import('@/lib/runtime/payload-validators'),
]);
const response = await handlePersistenceRequest(
@@ -556,7 +556,7 @@ describe('embedded persistence route', () => {
}));
vi.stubEnv('DATABASE_URL', 'postgres://adapter-test');
vi.stubEnv('PERSISTENCE_DEV_TOKEN', 'test-token');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const pool = { end: vi.fn().mockResolvedValue(undefined) };
const put = await handlePersistenceRequest(
@@ -612,7 +612,7 @@ describe('embedded persistence route', () => {
};
const readAdapterBody = async (path: string) => {
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const pool = { end: vi.fn().mockResolvedValue(undefined) };
const response = await handlePersistenceRequest(
new Request(`http://localhost/api/persistence/${path}`, {
@@ -761,7 +761,7 @@ describe('embedded persistence route', () => {
});
response.end('content');
}, 'postgres://head-test');
const { handlePersistenceRequest } = await import('@/app/api/persistence/[...path]/route');
const { handlePersistenceRequest } = await import('@/lib/persistence/http-route');
const response = await handlePersistenceRequest(
new Request('http://localhost/api/persistence/documents/head', {
method: 'HEAD',