mirror of
https://github.com/saltbo/zpan.git
synced 2026-08-29 00:01:42 +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>
39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { DirType, ObjectStatus, SignupMode, UserRole } from './constants.js'
|
|
|
|
describe('constants', () => {
|
|
it('UserRole values', () => {
|
|
expect(UserRole.ADMIN).toBe('admin')
|
|
expect(UserRole.MEMBER).toBe('member')
|
|
})
|
|
|
|
it('DirType values', () => {
|
|
expect(DirType.FILE).toBe(0)
|
|
expect(DirType.USER_FOLDER).toBe(1)
|
|
expect(DirType.SYSTEM_FOLDER).toBe(2)
|
|
})
|
|
|
|
it('ObjectStatus values', () => {
|
|
expect(ObjectStatus.DRAFT).toBe('draft')
|
|
expect(ObjectStatus.ACTIVE).toBe('active')
|
|
// Trash is tracked by trashedAt, not a status value — there is no TRASHED.
|
|
expect(Object.keys(ObjectStatus)).toEqual(['DRAFT', 'ACTIVE'])
|
|
})
|
|
|
|
it('SignupMode.OPEN equals "open"', () => {
|
|
expect(SignupMode.OPEN).toBe('open')
|
|
})
|
|
|
|
it('SignupMode.INVITE_ONLY equals "invite_only"', () => {
|
|
expect(SignupMode.INVITE_ONLY).toBe('invite_only')
|
|
})
|
|
|
|
it('SignupMode.CLOSED equals "closed"', () => {
|
|
expect(SignupMode.CLOSED).toBe('closed')
|
|
})
|
|
|
|
it('SignupMode has exactly three members', () => {
|
|
expect(Object.keys(SignupMode)).toHaveLength(3)
|
|
})
|
|
})
|