From 110d64ec332007919f39d06d7cb3aca8a460e7b4 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Tue, 14 Apr 2026 16:57:23 +0200 Subject: [PATCH] fix: some bugs --- .env.example | 6 +++--- README.md | 13 ++++++------- app/api/upload/drive/route.ts | 4 ++-- app/api/upload/git/route.ts | 6 ++++-- components/UploadZone.tsx | 8 +++----- components/upload/FolderCard.tsx | 15 ++++++++------- lib/commit-message.ts | 5 ++++- lib/nextcloud.ts | 14 +++++++------- 8 files changed, 37 insertions(+), 34 deletions(-) diff --git a/.env.example b/.env.example index a577f2a..614bd19 100644 --- a/.env.example +++ b/.env.example @@ -4,8 +4,8 @@ GIT_BRANCH=main GIT_REPO_URL=https://github.com/your-org/your-repo.git BLENDER_PATH=/Applications/Blender.app/Contents/MacOS/Blender -# Nextcloud Drive (WebDAV) +# Nextcloud Drive (public share WebDAV) NEXTCLOUD_URL=https://cloud.example.com -NEXTCLOUD_USER=your-nextcloud-username -NEXTCLOUD_PASSWORD=your-nextcloud-password +NEXTCLOUD_SHARE_TOKEN=your-public-share-token +NEXTCLOUD_SHARE_PASSWORD= NEXTCLOUD_BASE_PATH=Models \ No newline at end of file diff --git a/README.md b/README.md index 3931d98..ea31454 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,10 @@ GIT_BRANCH=main GIT_REPO_URL=https://github.com/your-org/your-repo.git BLENDER_PATH=/Applications/Blender.app/Contents/MacOS/Blender -# Nextcloud Drive (WebDAV) +# Nextcloud Drive (public share WebDAV) NEXTCLOUD_URL=https://cloud.example.com -NEXTCLOUD_USER=your-nextcloud-username -NEXTCLOUD_PASSWORD=your-nextcloud-password +NEXTCLOUD_SHARE_TOKEN=your-public-share-token +NEXTCLOUD_SHARE_PASSWORD= NEXTCLOUD_BASE_PATH=Models ``` @@ -51,8 +51,8 @@ NEXTCLOUD_BASE_PATH=Models | `GIT_REPO_URL` | Target GitHub repository URL | Yes | | `BLENDER_PATH` | Path to Blender binary (default: `blender`) | No | | `NEXTCLOUD_URL` | Nextcloud instance URL | Yes | -| `NEXTCLOUD_USER` | Nextcloud username (Basic auth) | Yes | -| `NEXTCLOUD_PASSWORD` | Nextcloud password (Basic auth) | Yes | +| `NEXTCLOUD_SHARE_TOKEN` | Public share token (the part after `/s/` in the share link) | Yes | +| `NEXTCLOUD_SHARE_PASSWORD` | Public share password (empty if none) | No | | `NEXTCLOUD_BASE_PATH` | Root folder on the Drive (default: `Models`) | No | > To create a GitHub token: GitHub > Settings > Developer settings > Fine-grained personal access tokens > select the target repo > Permissions > Contents: Read and write. @@ -78,8 +78,7 @@ docker run -p 3000:3000 \ -e GITHUB_TOKEN=ghp_xxx \ -e GIT_REPO_URL=https://github.com/org/repo.git \ -e NEXTCLOUD_URL=https://cloud.example.com \ - -e NEXTCLOUD_USER=user \ - -e NEXTCLOUD_PASSWORD=pass \ + -e NEXTCLOUD_SHARE_TOKEN=your-share-token \ upload-gltf ``` diff --git a/app/api/upload/drive/route.ts b/app/api/upload/drive/route.ts index cd8f842..c71316f 100644 --- a/app/api/upload/drive/route.ts +++ b/app/api/upload/drive/route.ts @@ -35,9 +35,9 @@ export async function POST(req: NextRequest) { if (authError) return authError // --- Check Nextcloud config --- - if (!process.env.NEXTCLOUD_URL || !process.env.NEXTCLOUD_USER || !process.env.NEXTCLOUD_PASSWORD) { + if (!process.env.NEXTCLOUD_URL || !process.env.NEXTCLOUD_SHARE_TOKEN) { return NextResponse.json( - { success: false, error: 'Nextcloud non configure sur le serveur' }, + { success: false, error: 'Nextcloud non configure sur le serveur (NEXTCLOUD_URL, NEXTCLOUD_SHARE_TOKEN)' }, { status: 500 }, ) } diff --git a/app/api/upload/git/route.ts b/app/api/upload/git/route.ts index f8705c9..956d08d 100644 --- a/app/api/upload/git/route.ts +++ b/app/api/upload/git/route.ts @@ -108,9 +108,11 @@ export async function POST(req: NextRequest) { const isModel = MODEL_EXTENSIONS.has(ext) if (isModel) { - // Model: always re-push since compression makes size comparison unreliable + // Model: always re-push since compression makes size comparison unreliable. + // Mark as 'unchanged' for the commit message when the folder already exists, + // because we can't know if the model really changed after Blender compression. const remoteSize = remoteFileMap.get(filename.toLowerCase()) - fileChanges.set(filename.toLowerCase(), remoteSize === undefined ? 'new' : 'changed') + fileChanges.set(filename.toLowerCase(), remoteSize === undefined ? 'new' : 'unchanged') changedFilesToPush.push(f) } else { // Texture: compare by size diff --git a/components/UploadZone.tsx b/components/UploadZone.tsx index 9cb4180..7b3e409 100644 --- a/components/UploadZone.tsx +++ b/components/UploadZone.tsx @@ -278,7 +278,7 @@ export default function UploadZone() { // ---- Step 1: Drive upload ---- updateEntry(i, { status: 'uploading', - progress: 0, + progress: 1, error: undefined, driveStatus: 'uploading', driveError: undefined, @@ -300,7 +300,7 @@ export default function UploadZone() { return } - updateEntry(i, { driveStatus: 'success' }) + updateEntry(i, { driveStatus: 'success', progress: 50 }) // ---- Step 2: Git upload ---- await pushGit(i, controller.signal) @@ -314,13 +314,11 @@ export default function UploadZone() { const pushGit = async (index: number, signal?: AbortSignal) => { const folderEntry = entries[index] - updateEntry(index, { progress: 5 }) - const gitResult = await uploadGit( folderEntry, secret, destination!, - (pct) => updateEntry(index, { progress: pct }), + (pct) => updateEntry(index, { progress: 50 + Math.round(pct / 2) }), signal, ) diff --git a/components/upload/FolderCard.tsx b/components/upload/FolderCard.tsx index 0960e03..2704b7f 100644 --- a/components/upload/FolderCard.tsx +++ b/components/upload/FolderCard.tsx @@ -62,7 +62,7 @@ export default function FolderCard({ entry, index, onToggleViewer, onRemove }: F Dossier
- modele : {entry.modelFile.name} + model : {entry.modelFile.name} {entry.status === 'error' && entry.error && ( {entry.error} )} @@ -71,8 +71,8 @@ export default function FolderCard({ entry, index, onToggleViewer, onRemove }: F )}
- {/* Drive status sub-line */} - {entry.driveStatus && entry.driveStatus !== 'pending' && ( + {/* Drive status sub-line (only during upload, not after success) */} + {entry.status !== 'success' && entry.driveStatus && entry.driveStatus !== 'pending' && (
{entry.driveStatus === 'uploading' && ( <> @@ -80,15 +80,16 @@ export default function FolderCard({ entry, index, onToggleViewer, onRemove }: F - Drive en cours... + Upload Drive en cours... )} {entry.driveStatus === 'success' && ( <> - - + + + - Drive OK + Upload Git en cours... )} {entry.driveStatus === 'error' && ( diff --git a/lib/commit-message.ts b/lib/commit-message.ts index 2dca9a4..8d9de2f 100644 --- a/lib/commit-message.ts +++ b/lib/commit-message.ts @@ -26,7 +26,7 @@ export function buildCommitMessage( const lines: string[] = [title, ''] - // Model section — only show if changed or new + // Model section — show status for new, changed, or unchanged const modelChange = fileChanges.get(modelFilename.toLowerCase()) if (modelChange === 'new') { lines.push('📦 Model') @@ -34,6 +34,9 @@ export function buildCommitMessage( } else if (modelChange === 'changed') { lines.push('📦 Model') lines.push(` 🔄 ${modelFilename}${compressed ? ' (compressed)' : ''}`) + } else if (modelChange === 'unchanged') { + lines.push('📦 Model') + lines.push(` ↔️ ${modelFilename} (inchange)`) } // Textures section — only show lines that have changes diff --git a/lib/nextcloud.ts b/lib/nextcloud.ts index 5cf8619..085aed3 100644 --- a/lib/nextcloud.ts +++ b/lib/nextcloud.ts @@ -5,17 +5,17 @@ function getConfig() { const url = process.env.NEXTCLOUD_URL - const user = process.env.NEXTCLOUD_USER - const password = process.env.NEXTCLOUD_PASSWORD + const token = process.env.NEXTCLOUD_SHARE_TOKEN + const password = process.env.NEXTCLOUD_SHARE_PASSWORD || '' const basePath = process.env.NEXTCLOUD_BASE_PATH || 'Models' - if (!url || !user || !password) { - throw new Error('Nextcloud non configure (NEXTCLOUD_URL, NEXTCLOUD_USER, NEXTCLOUD_PASSWORD)') + if (!url || !token) { + throw new Error('Nextcloud non configure (NEXTCLOUD_URL, NEXTCLOUD_SHARE_TOKEN)') } - // WebDAV base: https://cloud.example.com/remote.php/dav/files/{user}/ - const davBase = `${url.replace(/\/+$/, '')}/remote.php/dav/files/${encodeURIComponent(user)}` - const auth = 'Basic ' + Buffer.from(`${user}:${password}`).toString('base64') + // Public share WebDAV: https://cloud.example.com/public.php/webdav/ + const davBase = `${url.replace(/\/+$/, '')}/public.php/webdav` + const auth = 'Basic ' + Buffer.from(`${token}:${password}`).toString('base64') return { davBase, auth, basePath } }