mirror of
https://github.com/saltbo/zpan.git
synced 2026-09-01 15:49:00 +08:00
00f48cf355
* feat(avatars): host avatars + team logos on Cloud via SDK 2.4.0; remove public-bucket mode Host user avatars and org logos on the ZPan Cloud avatar service (zpan-cloud-sdk ^2.4.0) instead of a public S3/R2 bucket, then remove the now-dead storages.mode / public-bucket concept entirely (#456 parts 2-3). - image-upload gateway: upload/delete via SDK uploadAvatar/deleteAvatar against a bound Cloud client; validate mime (AVATAR_CONTENT_TYPES) + size (MAX_AVATAR_BYTES) before the call; map cloud error codes to 400/403/413/500; unbound instance returns 503 cloud_required (delete is a best-effort no-op). - licensing-cloud: createAvatarUploadClient builds the client with a plain-object bearer header so both the image content-type and Authorization survive hono's per-request header merge (a Headers instance would be dropped). - drop storages.mode (migration via drizzle-kit), StorageRepo.select() no longer takes a mode, remove StorageMode / Storage.mode / mode schema+audit+UI+i18n and the PUBLIC_IMAGES bucket + PUBLIC_IMAGES_URL wiring. Agent-Profile: https://agent-kanban.dev/agents/f759c704c282d88a * ci(deploy): drop dead PUBLIC_IMAGES R2 provisioning from CF deploy The Cloud avatar migration removed the PUBLIC_IMAGES binding from wrangler.toml, so the deploy workflow's R2 public-images steps are dead and must go too — otherwise every CF deploy keeps re-provisioning a public-read zpan-public-images bucket (the footgun #456 eliminates) and sets an unused PUBLIC_IMAGES_URL secret. Removes the bucket-create, managed-public-URL, and secret steps (steps.r2 was only consumed by the secret step). Also drops a stale storage-modes line from the v2.0 roadmap. Agent-Profile: https://agent-kanban.dev/agents/f759c704c282d88a --------- Co-authored-by: Alex Chen <alex-chen@mails.agent-kanban.dev>
107 lines
5.5 KiB
TypeScript
107 lines
5.5 KiB
TypeScript
// The composition root. createDeps wires concrete adapters into the Deps object
|
|
// the rest of the server consumes. This is the ONLY place adapters are
|
|
// constructed. Keep it a cheap, request-free factory so the scheduled/queue
|
|
// entrypoints can reuse it; request-bound capabilities are passed to usecases as
|
|
// function parameters, never stored here.
|
|
|
|
import { createArchiveJobsGateway } from './adapters/gateways/archive-jobs'
|
|
import { createEmailGateway } from './adapters/gateways/email'
|
|
import { createImageUploadGateway } from './adapters/gateways/image-upload'
|
|
import { createLicensingCloudGateway } from './adapters/gateways/licensing-cloud'
|
|
import { S3Service } from './adapters/gateways/s3'
|
|
import { createZipGateway } from './adapters/gateways/zip'
|
|
import { createCfClient } from './adapters/providers/cf-custom-hostnames'
|
|
import { createChangelogProvider } from './adapters/providers/changelog'
|
|
import { createActivityRepo } from './adapters/repos/activity'
|
|
import { createAnnouncementRepo } from './adapters/repos/announcement'
|
|
import { createApiKeyGateway } from './adapters/repos/api-keys'
|
|
import { createArchiveTargetFolderRepo } from './adapters/repos/archive-target-folder'
|
|
import { createBackgroundJobRepo } from './adapters/repos/background-job'
|
|
import { createCloudStoreRepo } from './adapters/repos/cloud-store'
|
|
import { createCloudTrafficReportRepo } from './adapters/repos/cloud-traffic-report'
|
|
import { createDownloadTaskRepo } from './adapters/repos/download-task'
|
|
import { createDownloadTokenGateway } from './adapters/repos/download-tokens'
|
|
import { createDownloaderRepo } from './adapters/repos/downloader'
|
|
import { createImageHostingRepo } from './adapters/repos/image-hosting'
|
|
import { createImageHostingConfigRepo } from './adapters/repos/image-hosting-config'
|
|
import { createInstanceRepo } from './adapters/repos/instance'
|
|
import { createInviteRepo } from './adapters/repos/invite'
|
|
import { createLicenseBindingRepo } from './adapters/repos/license-binding'
|
|
import { createMatterRepo } from './adapters/repos/matter'
|
|
import { createMemberCountRepo } from './adapters/repos/member-count'
|
|
import { createNotificationRepo } from './adapters/repos/notification'
|
|
import { createObjectUploadSessionRepo } from './adapters/repos/object-upload-session'
|
|
import { createOrgRepo } from './adapters/repos/org'
|
|
import { createProfileRepo } from './adapters/repos/profile'
|
|
import { createQuotaRepo } from './adapters/repos/quota'
|
|
import { createRemoteDownloadUsageRepo } from './adapters/repos/remote-download-usage'
|
|
import { createShareRepo } from './adapters/repos/share'
|
|
import { createShareNotificationRepo } from './adapters/repos/share-notification'
|
|
import { createSiteInvitationRepo } from './adapters/repos/site-invitations'
|
|
import { createStorageRepo } from './adapters/repos/storage'
|
|
import { createStorageUsageRepo } from './adapters/repos/storage-usage'
|
|
import { createSystemOptionsRepo } from './adapters/repos/system-options'
|
|
import { createTeamRepo } from './adapters/repos/team'
|
|
import { createTeamInviteRepo } from './adapters/repos/team-invite'
|
|
import { createUserAdminRepo } from './adapters/repos/user-admin'
|
|
import { createWebDavPathRepo } from './adapters/repos/webdav-path'
|
|
import { createWebDavStateRepo } from './adapters/repos/webdav-state'
|
|
import { createZipPlanRepo } from './adapters/repos/zip'
|
|
import type { Platform } from './platform/interface'
|
|
import type { Deps } from './usecases/deps'
|
|
|
|
export function createDeps(platform: Platform): Deps {
|
|
const { db } = platform
|
|
// Shared stateless instances reused by multiple ports below.
|
|
const s3 = new S3Service()
|
|
const storages = createStorageRepo(db)
|
|
const systemOptions = createSystemOptionsRepo(db)
|
|
const licenseBinding = createLicenseBindingRepo(db)
|
|
const licensingCloud = createLicensingCloudGateway()
|
|
return {
|
|
activity: createActivityRepo(db),
|
|
announcements: createAnnouncementRepo(db),
|
|
apiKeys: createApiKeyGateway(),
|
|
archiveJobs: createArchiveJobsGateway(platform),
|
|
archiveTargetFolders: createArchiveTargetFolderRepo(db),
|
|
backgroundJobs: createBackgroundJobRepo(db),
|
|
cfHostnames: createCfClient((key) => platform.getEnv(key)),
|
|
changelog: createChangelogProvider(),
|
|
cloudStore: createCloudStoreRepo(db),
|
|
cloudTrafficReports: createCloudTrafficReportRepo(db),
|
|
downloaders: createDownloaderRepo(db),
|
|
downloadTasks: createDownloadTaskRepo(db),
|
|
downloadTokens: createDownloadTokenGateway(),
|
|
email: createEmailGateway(systemOptions),
|
|
invites: createInviteRepo(db),
|
|
imageHostingConfigs: createImageHostingConfigRepo(db),
|
|
imageHosting: createImageHostingRepo(db),
|
|
imageUpload: createImageUploadGateway(licenseBinding, licensingCloud),
|
|
instance: createInstanceRepo(db),
|
|
licenseBinding,
|
|
licensingCloud,
|
|
matter: createMatterRepo(db),
|
|
memberCount: createMemberCountRepo(db),
|
|
notifications: createNotificationRepo(db),
|
|
objectUploadSessions: createObjectUploadSessionRepo(db),
|
|
org: createOrgRepo(db),
|
|
profiles: createProfileRepo(db),
|
|
quota: createQuotaRepo(db),
|
|
remoteDownloadUsage: createRemoteDownloadUsageRepo(db),
|
|
s3,
|
|
shareNotifications: createShareNotificationRepo(db),
|
|
share: createShareRepo(db),
|
|
siteInvitations: createSiteInvitationRepo(db),
|
|
storages,
|
|
storageUsage: createStorageUsageRepo(db),
|
|
systemOptions,
|
|
teams: createTeamRepo(db),
|
|
teamInvites: createTeamInviteRepo(db),
|
|
userAdmin: createUserAdminRepo(db),
|
|
webdavPath: createWebDavPathRepo(db),
|
|
webdavState: createWebDavStateRepo(db),
|
|
zip: createZipGateway(),
|
|
zipPlan: createZipPlanRepo(db),
|
|
}
|
|
}
|