API

NextJS

src/pages/api/logout.js

import supabase from '../../lib/supabase';

export default async function handler(req, res) {
    if (req.method !== 'POST') {
        return res.status(405).json({ error: 'METHOD NOT ALLOWED' });
    }
    const { error } = await supabase.auth.signOut();
    if (error) {
        return res.status(500).json({ error: error.message });
    }
    res.status(200).json({ message: 'LOGOUT SUCCESS' });
}

src/pages/api/addProduct.js

import supabase from '../../lib/supabase';
import { IncomingForm } from 'formidable';
import fs from 'fs';

export const config = {
    api: {
        bodyParser: false,
    }
};

export default async function handler(req, res) {
    if (req.method !== 'POST') {
        return res.status(405).json({ error: 'METHODS NOT ALLOWED' });
    }

    const form = new IncomingForm({ keepExtensions: true, multiples: true });

    form.parse(req, async (err, fields, files) => {
        if (err) {
            return res.status(500).json({ error: 'ファイルの解析に失敗しました' });
        }

        console.log('Fields:', fields);
        console.log('Files:', files);
        
        const name = Array.isArray(fields.name) ? fields.name[0] : fields.name;
        const price = Array.isArray(fields.price) ? fields.price[0] : fields.price;
        const description = Array.isArray(fields.description) ? fields.description[0] : fields.description;
        const quantity = Array.isArray(fields.quantity) ? fields.quantity[0] : fields.quantity;
        const user = Array.isArray(fields.user) ? fields.user[0] : fields.user;
        
        // 画像が1枚以上あるか確認します
        const imageFiles = Object.values(files).flat();
        if (imageFiles.length === 0) {
            return res.status(400).json({ error: '画像がありません' });
        }
        const imageUrls = [];


        // 画像をSupabaseストレージにアップロード
        for (const imageFile of imageFiles) {
            // ファイルがアップロードされていない場合はcontinue
            if (!imageFile.originalFilename) continue;
            const imgFilePath = imageFile.filepath || imageFile.filePath;
            if (!imgFilePath) continue;

            // ファイルの拡張子やパスを取得します
            const fileExt = imageFile.originalFilename.split('.').pop();
            const fileName = `${Date.now()}-${Math.random().toString(36).substr(2, 9)}.${fileExt}`;
            const filePath = `products/${fileName}`;
            const fileBuffer = fs.readFileSync(imgFilePath);

            // Supabaseストレージにアップロード
            const { data: uploadData, error: uploadError } = await supabase.storage
                .from('productBucket')
                .upload(filePath, fileBuffer, {
                    contentType: imageFile.mimetype,
                });
            
            // エラーハンドリング
            if (uploadError) {
                console.error('Supabase Storage Upload Error:', uploadError);
                return res.status(500).json({ error: uploadError.message });
            }
            console.log('Upload Success:', uploadData);

            // 画像の公開URLを取得
            const { data: publicURL } = supabase.storage.from('productBucket').getPublicUrl(filePath);
            console.log('Public URL:', publicURL);
            if (publicURL.publicUrl) {
                imageUrls.push(publicURL.publicUrl);
            }
        }



        // Supabaseデータベースに商品情報を追加            
        const { data, error } = await supabase.from('products').insert([
            { name, price: parseInt(price, 10), description, quantity, user, image_url: imageUrls },
        ]);

        // エラーハンドリング
        if (error) {
            console.error('Supabase Insert Error:', error);
            return res.status(500).json({ error: error.message });
        }
        return res.status(200).json({ message: 'PRODUCT ADDED SUCCESSFULLY', data });
    });

};
BACK