File size: 2,718 Bytes
271988a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
'use server';

import { db } from '@/lib/db';
import { productRequests } from '@/lib/db/schema';
import { eq } from 'drizzle-orm';
import { revalidatePath } from 'next/cache';
import { uploadThumbnail } from '@/features/discovery/services/storage.service';

export async function uploadRequestImage(formData: FormData) {
    try {
        const file = formData.get('file') as File;
        if (!file) {
            return { success: false, error: 'No file uploaded' };
        }

        // Validate file type
        if (!file.type.startsWith('image/')) {
            return { success: false, error: 'File must be an image' };
        }

        // Convert File to Buffer
        const arrayBuffer = await file.arrayBuffer();
        const buffer = Buffer.from(arrayBuffer);

        const safeName = (file.name || 'request.png').replace(/[^a-zA-Z0-9.]/g, '_');
        const fileName = `viewer-requests/${Date.now()}-${safeName}`;

        const publicUrl = await uploadThumbnail(buffer, fileName, file.type);

        if (!publicUrl) {
            return { success: false, error: 'Failed to upload to storage' };
        }

        return { success: true, url: publicUrl };
    } catch (error: any) {
        console.error('uploadRequestImage error:', error);
        return { success: false, error: error.message || 'Upload failed' };
    }
}

export async function submitProductRequest(data: {
    videoId: string;
    creatorId: string;
    viewerName?: string;
    viewerEmail?: string;
    note: string;
    imageUrl?: string;
    frameTimestamp?: number;
}) {
    try {
        const [request] = await db.insert(productRequests).values({
            videoId: data.videoId,
            creatorId: data.creatorId,
            viewerName: data.viewerName,
            viewerEmail: data.viewerEmail,
            note: data.note,
            imageUrl: data.imageUrl,
            frameTimestamp: data.frameTimestamp,
            status: 'PENDING',
        }).returning();

        revalidatePath('/dashboard/requests');
        return { success: true, id: request.id };
    } catch (error: any) {
        console.error('Failed to submit product request:', error);
        return { success: false, error: error.message };
    }
}

export async function updateRequestStatus(requestId: string, status: 'PENDING' | 'FULFILLED' | 'DISMISSED') {
    try {
        await db.update(productRequests)
            .set({ status })
            .where(eq(productRequests.id, requestId));

        revalidatePath('/dashboard/requests');
        return { success: true };
    } catch (error: any) {
        console.error('Failed to update request status:', error);
        return { success: false, error: error.message };
    }
}