Skip to content

API Quản Lý Tệp Tin (Media) ​

Module Media cung cấp các phương thức để quản lý tệp tin, hình ảnh và thư mục trong hệ thống Pancake POS. Hỗ trợ nhiều định dạng tệp tin và cung cấp các tính năng xử lý hình ảnh.

Khởi Tạo ​

typescript
import { PancakeClient } from 'pancake-client-sdk';

const client = new PancakeClient('your-api-key', 'your-shop-id');
const mediaApi = client.media;

Quản Lý Tệp Tin ​

Lấy Danh Sách Tệp Tin ​

typescript
const { data: files } = await client.media.list({
  page_size: 20,
  page_number: 1,
  type: 'image',
  folder_id: 'folder-1',
  order_by: 'created_at',
  order_direction: 'desc'
});

Tham Số Lọc ​

TênKiểuBắt buộcMô tả
page_sizenumberkhôngSố tệp tin trên trang
page_numbernumberkhôngSố trang
typestringkhôngLoại tệp tin: 'image', 'video', 'document', 'audio'
folder_idstringkhôngLọc theo thư mục
searchstringkhôngTìm kiếm theo tên
from_datestringkhôngTừ ngày (YYYY-MM-DD)
to_datestringkhôngĐến ngày (YYYY-MM-DD)
order_bystringkhôngSắp xếp theo: 'created_at', 'name', 'size'
order_directionstringkhôngHướng sắp xếp: 'asc' hoặc 'desc'
tagsstring[]khôngLọc theo tags

Tìm Kiếm Tệp Tin ​

typescript
const { data: files } = await client.media.search('banner', {
  type: 'image',
  page_size: 20
});

Tải Lên Tệp Tin ​

typescript
const file = await client.media.upload({
  file: fileBlob,
  folder_id: 'folder-1',
  tags: ['banner', 'homepage'],
  metadata: {
    alt: 'Banner trang chủ'
  },
  filename: 'banner.jpg',
  content_type: 'image/jpeg'
});

Tải Lên Trực Tiếp ​

typescript
// Lấy URL tải lên
const { upload_url, expires_at, fields } = await client.media.getUploadUrl({
  filename: 'large-file.zip',
  content_type: 'application/zip',
  size: 1024 * 1024 * 100 // 100MB
});

// Sử dụng upload_url để tải lên trực tiếp

Cập Nhật Thông Tin ​

typescript
const updatedFile = await client.media.update('media-id', {
  name: 'banner-new.jpg',
  folder_id: 'folder-2',
  tags: ['banner', 'promotion'],
  metadata: {
    alt: 'Banner khuyến mãi'
  }
});

Xóa Tệp Tin ​

typescript
await client.media.delete('media-id');

Quản Lý Thư Mục ​

Lấy Danh Sách Thư Mục ​

typescript
const { data: folders } = await client.media.listFolders();

Tạo Thư Mục Mới ​

typescript
const newFolder = await client.media.createFolder({
  name: 'Hình ảnh sản phẩm',
  parent_id: 'parent-folder-id'
});

Cập Nhật Thư Mục ​

typescript
const updatedFolder = await client.media.updateFolder('folder-id', {
  name: 'Hình ảnh sản phẩm 2024'
});

Xóa Thư Mục ​

typescript
// Xóa thư mục rỗng
await client.media.deleteFolder('folder-id');

// Xóa thư mục và toàn bộ nội dung
await client.media.deleteFolder('folder-id', true);

Xử Lý Hình Ảnh ​

Xử Lý Hình Ảnh ​

typescript
const processedImage = await client.media.processImage('image-id', {
  width: 800,
  height: 600,
  crop: true,
  quality: 80,
  format: 'webp',
  brightness: 1.2,
  contrast: 1.1,
  watermark: {
    text: '© Shop ABC',
    position: 'bottom-right',
    opacity: 0.5
  }
});

Tạo Thumbnail ​

typescript
const thumbnail = await client.media.generateThumbnail('image-id', {
  width: 200,
  height: 200,
  format: 'webp'
});

Quản Lý Bảo Mật ​

Quét Virus/Malware ​

typescript
const scanResult = await client.media.scanMedia('media-id');

Tạo URL Tải Xuống An Toàn ​

typescript
const { download_url, expires_at } = await client.media.getDownloadUrl('media-id', {
  expires_in: 3600, // Hết hạn sau 1 giờ
  filename: 'custom-filename.jpg'
});

Thống Kê và Quản Lý Hàng Loạt ​

Lấy Thống Kê ​

typescript
const stats = await client.media.getStats();

Thao Tác Hàng Loạt ​

typescript
const result = await client.media.bulkOperation({
  media_ids: ['id-1', 'id-2', 'id-3'],
  operation: 'move',
  params: {
    folder_id: 'target-folder'
  }
});

Models ​

Media ​

typescript
interface Media {
  id: string;
  name: string;
  type: MediaType;
  mime_type: string;
  size: number;
  url: string;
  thumbnail_url?: string;
  metadata?: MediaMetadata;
  tags?: string[];
  folder_id?: string;
  created_by: {
    id: string;
    name: string;
  };
  created_at: string;
  updated_at: string;
}

MediaMetadata ​

typescript
interface MediaMetadata {
  width?: number;
  height?: number;
  duration?: number;
  format?: string;
  bit_rate?: number;
  frame_rate?: number;
  pages?: number;
  exif?: Record<string, any>;
}

ImageProcessingOptions ​

typescript
interface ImageProcessingOptions {
  width?: number;
  height?: number;
  crop?: boolean;
  quality?: number;
  format?: 'jpeg' | 'png' | 'webp';
  blur?: number;
  brightness?: number;
  contrast?: number;
  grayscale?: boolean;
  rotate?: number;
  flip?: 'horizontal' | 'vertical';
  watermark?: {
    text?: string;
    image_url?: string;
    position?: 'center' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
    opacity?: number;
  };
}

Ví Dụ Sử Dụng ​

Tải Lên và Xử Lý Hình Ảnh Sản Phẩm ​

typescript
async function uploadAndProcessProductImage(file: File) {
  try {
    // Tải lên hình ảnh gốc
    const media = await client.media.upload({
      file,
      folder_id: 'products-folder',
      tags: ['product', 'original'],
      metadata: {
        product_id: 'product-123'
      }
    });

    // Tạo các phiên bản khác nhau
    const versions = await Promise.all([
      // Phiên bản hiển thị chính
      client.media.processImage(media.id, {
        width: 800,
        height: 800,
        crop: true,
        quality: 85,
        format: 'webp',
        watermark: {
          text: '© Shop ABC',
          position: 'bottom-right',
          opacity: 0.3
        }
      }),

      // Phiên bản thumbnail
      client.media.generateThumbnail(media.id, {
        width: 200,
        height: 200,
        format: 'webp'
      }),

      // Phiên bản zoom
      client.media.processImage(media.id, {
        width: 1600,
        quality: 90,
        format: 'webp'
      })
    ]);

    console.log('Đã xử lý xong hình ảnh sản phẩm:', {
      original: media,
      versions
    });

  } catch (error) {
    console.error('Lỗi khi xử lý hình ảnh:', error);
  }
}

Quản Lý Thư Viện Ảnh ​

typescript
async function organizeMediaLibrary() {
  try {
    // Lấy thống kê hiện tại
    const stats = await client.media.getStats();
    console.log('Thống kê thư viện:', stats);

    // Tạo cấu trúc thư mục
    const folders = await Promise.all([
      client.media.createFolder({ name: 'Sản phẩm' }),
      client.media.createFolder({ name: 'Banner' }),
      client.media.createFolder({ name: 'Blog' })
    ]);

    // Tạo thư mục con cho sản phẩm
    const productSubfolders = await Promise.all([
      client.media.createFolder({
        name: 'Ảnh chính',
        parent_id: folders[0].id
      }),
      client.media.createFolder({
        name: 'Ảnh chi tiết',
        parent_id: folders[0].id
      })
    ]);

    // Di chuyển tệp tin vào thư mục tương ứng
    const { data: files } = await client.media.list({
      page_size: 100
    });

    // Phân loại và di chuyển file
    const moveOperations = files.map(file => {
      let targetFolder = null;
      if (file.tags?.includes('product')) {
        targetFolder = productSubfolders[0].id;
      } else if (file.tags?.includes('banner')) {
        targetFolder = folders[1].id;
      } else if (file.tags?.includes('blog')) {
        targetFolder = folders[2].id;
      }

      if (targetFolder) {
        return client.media.update(file.id, {
          folder_id: targetFolder
        });
      }
    });

    await Promise.all(moveOperations.filter(Boolean));
    
    console.log('Đã tổ chức lại thư viện ảnh!');

  } catch (error) {
    console.error('Lỗi khi tổ chức thư viện:', error);
  }
}