İçe Aktarma ve Dışa Aktarma

Projeleri yedekleme veya transfer amaçlı taşınabilir .mpz dosyaları olarak dışa aktarın ve diğer tenantlara içe aktarın. Ayrıca proje küçük resimlerini yönetin.

Proje Paketleri (.mpz)

.mpz formatı, aşağıdakileri içeren bir mindzie Paket Zip dosyasıdır:

  • Proje ayarları ve meta veriler
  • Tüm veri setleri ve konfigürasyonları
  • İncelemeler ve not defterleri
  • Gösterge tabloları ve paneller
  • Blob depolama dosyaları (olay kayıtları, ekler)

Proje Dışa Aktarımı

GET /api/{tenantId}/project/{projectId}/download

Projeyi .mpz (mindzie Paket Zip) dosyası olarak dışa aktarır.

Yol Parametreleri

Parametre Tip Zorunlu Açıklama
tenantId GUID Evet Tenant kimliği
projectId GUID Evet Dışa aktarılacak proje

Yanıt

Aşağıdaki özelliklere sahip ikili dosya indirmesi döner:

  • Content-Type: application/octet-stream
  • Dosya adı: {projectName}.mpz

Kullanım Durumları

  • Yedekleme: Önemli projelerin düzenli yedeklerini oluşturma
  • Geçiş: Projeleri tenantlar veya örnekler arasında taşıma
  • Şablonlar: Yeni analizler için yapılandırılmış bir projeyi şablon olarak dışa aktarma

Proje İçe Aktarımı

POST /api/{tenantId}/project/import

Bir projeyi .mpz dosyasından içe aktarır.

Yol Parametreleri

Parametre Tip Zorunlu Açıklama
tenantId GUID Evet Hedef tenant

İstek

  • Content-Type: multipart/form-data
  • Dosya parametresi: file (.mpz dosyası)

Kısıtlamalar

Kısıtlama Değer
Maksimum dosya boyutu 1 GB
Dosya uzantısı .mpz olmalıdır
Dosya formatı Geçerli bir mindzie proje dışa aktarımı olmalıdır

Yanıt (200 OK)

{
  "success": true,
  "projectId": "99999999-9999-9999-9999-999999999999",
  "projectName": "Imported Project",
  "datasetsImported": 2,
  "investigationsImported": 3,
  "dashboardsImported": 1,
  "message": "Project imported successfully"
}

Yanıt Alanları

Alan Tip Açıklama
success boolean İçe aktarımın başarılı olup olmadığı
projectId GUID Yeni oluşturulan projenin ID'si
projectName string İçe aktarılan projenin adı
datasetsImported integer İçe aktarılan veri seti sayısı
investigationsImported integer İçe aktarılan inceleme sayısı
dashboardsImported integer İçe aktarılan gösterge tablosu sayısı
message string İnsan tarafından okunabilir durum mesajı

Hata Yanıtları

Geçersiz İstek (400):

{
  "success": false,
  "errorMessage": "Invalid file format. Expected .mpz file."
}

Küçük Resim Yönetimi

Proje küçük resimleri proje listesinde gösterilir ve görsel tanımlama sağlar.

Küçük Resim Alma

GET /api/{tenantId}/project/{projectId}/thumbnail

Projenin küçük resim görselini alır.

Yanıt (200 OK)

{
  "projectId": "87654321-4321-4321-4321-210987654321",
  "hasThumbnail": true,
  "base64Image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD..."
}

Yanıt Alanları

Alan Tip Açıklama
projectId GUID Proje kimliği
hasThumbnail boolean Küçük resmin var olup olmadığı
base64Image string Veri URI ön ekiyle birlikte base64 kodlu görüntü

Küçük Resmi Güncelleme

POST /api/{tenantId}/project/{projectId}/thumbnail

Projenin küçük resim görselini günceller.

İstek Gövdesi

{
  "base64Image": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD..."
}

Not: Base64 dizisi veri URI ön eki (data:image/jpeg;base64, veya data:image/png;base64, gibi) ile birlikte olmalıdır.

Yanıt (200 OK)

{
  "message": "Thumbnail updated successfully"
}

Küçük Resmi Kaldırma

DELETE /api/{tenantId}/project/{projectId}/thumbnail

Projenin küçük resim görselini kaldırır.

Yanıt (200 OK)

{
  "message": "Thumbnail removed successfully"
}

Uygulama Örnekleri

cURL

# Projeyi dosyaya dışa aktar
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/download" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  --output project_backup.mpz

# Projeyi dosyadan içe aktar
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/import" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -F "file=@project_backup.mpz"

# Küçük resmi al
curl -X GET "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/thumbnail" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

# Küçük resmi güncelle (base64 dosyasından)
curl -X POST "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/thumbnail" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"base64Image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..."}'

# Küçük resmi kaldır
curl -X DELETE "https://your-mindzie-instance.com/api/12345678-1234-1234-1234-123456789012/project/87654321-4321-4321-4321-210987654321/thumbnail" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Python

import requests
import base64
from pathlib import Path

TENANT_ID = '12345678-1234-1234-1234-123456789012'
BASE_URL = 'https://your-mindzie-instance.com'

class ProjectExportManager:
    def __init__(self, token):
        self.headers = {
            'Authorization': f'Bearer {token}'
        }

    def export_project(self, project_id, output_path):
        """Projeyi .mpz dosyasına dışa aktar."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/download'
        response = requests.get(url, headers=self.headers, stream=True)
        response.raise_for_status()

        with open(output_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                f.write(chunk)

        print(f"{output_path} olarak dışa aktarıldı")
        return output_path

    def import_project(self, file_path):
        """Projeyi .mpz dosyasından içe aktar."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/import'

        with open(file_path, 'rb') as f:
            files = {'file': (Path(file_path).name, f, 'application/octet-stream')}
            response = requests.post(url, headers=self.headers, files=files)

        response.raise_for_status()
        result = response.json()

        print(f"İçe aktarılan proje: {result['projectName']}")
        print(f"  Veri setleri: {result['datasetsImported']}")
        print(f"  İncelemeler: {result['investigationsImported']}")
        print(f"  Gösterge tabloları: {result['dashboardsImported']}")

        return result

    def get_thumbnail(self, project_id):
        """Proje küçük resmini base64 olarak al."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/thumbnail'
        response = requests.get(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

    def set_thumbnail(self, project_id, image_path):
        """Proje küçük resmini image dosyasından ayarla."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/thumbnail'

        # Görüntüyü oku ve encode et
        with open(image_path, 'rb') as f:
            image_data = f.read()

        # MIME türünü belirle
        ext = Path(image_path).suffix.lower()
        mime_type = 'image/jpeg' if ext in ['.jpg', '.jpeg'] else 'image/png'

        # base64 veri URI oluştur
        base64_data = base64.b64encode(image_data).decode('utf-8')
        data_uri = f'data:{mime_type};base64,{base64_data}'

        headers = {**self.headers, 'Content-Type': 'application/json'}
        response = requests.post(url, json={'base64Image': data_uri}, headers=headers)
        response.raise_for_status()

        print(f"Proje {project_id} için küçük resim güncellendi")
        return response.json()

    def remove_thumbnail(self, project_id):
        """Projenin küçük resmini kaldır."""
        url = f'{BASE_URL}/api/{TENANT_ID}/project/{project_id}/thumbnail'
        response = requests.delete(url, headers=self.headers)
        response.raise_for_status()
        return response.json()

# Kullanım
manager = ProjectExportManager('your-auth-token')
project_id = '87654321-4321-4321-4321-210987654321'

# Projeyi yedek için dışa aktar
manager.export_project(project_id, 'my_project_backup.mpz')

# Aynı veya farklı tenant'a içe aktar
result = manager.import_project('my_project_backup.mpz')
new_project_id = result['projectId']

# Küçük resim ayarla
manager.set_thumbnail(project_id, 'project_thumbnail.png')

# Küçük resmi al
thumbnail = manager.get_thumbnail(project_id)
if thumbnail['hasThumbnail']:
    print("Küçük resim mevcut")

JavaScript/Node.js

const fs = require('fs');
const path = require('path');
const FormData = require('form-data');

const TENANT_ID = '12345678-1234-1234-1234-123456789012';
const BASE_URL = 'https://your-mindzie-instance.com';

class ProjectExportManager {
  constructor(token) {
    this.headers = {
      'Authorization': `Bearer ${token}`
    };
  }

  async exportProject(projectId, outputPath) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/download`;
    const response = await fetch(url, { headers: this.headers });

    if (!response.ok) {
      throw new Error(`Dışa aktarma başarısız: ${response.status}`);
    }

    const buffer = await response.arrayBuffer();
    fs.writeFileSync(outputPath, Buffer.from(buffer));
    console.log(`${outputPath} olarak dışa aktarıldı`);
  }

  async importProject(filePath) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/import`;

    const formData = new FormData();
    formData.append('file', fs.createReadStream(filePath));

    const response = await fetch(url, {
      method: 'POST',
      headers: {
        ...this.headers,
        ...formData.getHeaders()
      },
      body: formData
    });

    if (!response.ok) {
      throw new Error(`İçe aktarma başarısız: ${response.status}`);
    }

    const result = await response.json();
    console.log(`İçe aktarılan proje: ${result.projectName}`);
    return result;
  }

  async setThumbnail(projectId, imagePath) {
    const url = `${BASE_URL}/api/${TENANT_ID}/project/${projectId}/thumbnail`;

    // Görüntüyü oku ve encode et
    const imageBuffer = fs.readFileSync(imagePath);
    const ext = path.extname(imagePath).toLowerCase();
    const mimeType = ext === '.png' ? 'image/png' : 'image/jpeg';
    const base64Data = imageBuffer.toString('base64');
    const dataUri = `data:${mimeType};base64,${base64Data}`;

    const response = await fetch(url, {
      method: 'POST',
      headers: {
        ...this.headers,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ base64Image: dataUri })
    });

    if (!response.ok) {
      throw new Error(`Küçük resim güncellemesi başarısız: ${response.status}`);
    }

    return await response.json();
  }
}

// Kullanım
const manager = new ProjectExportManager('your-auth-token');

// Dışa aktar ve içe aktar
await manager.exportProject('project-id', 'backup.mpz');
const imported = await manager.importProject('backup.mpz');

// Küçük resmi ayarla
await manager.setThumbnail('project-id', 'thumbnail.png');

En İyi Uygulamalar

  1. Düzenli Yedekleme: Önemli projelerin düzenli dışa aktarımını planlayın
  2. Sürüm Adlandırması: Dışa aktarma dosyası adlarında tarih kullanın (örneğin, project_2024-01-15.mpz)
  3. İçe Aktarım Testi: Üretim ortamı dışında bir tenantta içe aktarımları test edin
  4. Küçük Resim Boyutu: Küçük resimleri 100KB altında tutarak hızlı yüklenme sağlayın
  5. Küçük Resim Formatı: Fotoğraflar için JPEG, şeffaflık içeren grafikler için PNG kullanın