Add Activepieces integration for workflow automation
- Add Activepieces fork with SmoothSchedule custom piece - Create integrations app with Activepieces service layer - Add embed token endpoint for iframe integration - Create Automations page with embedded workflow builder - Add sidebar visibility fix for embed mode - Add list inactive customers endpoint to Public API - Include SmoothSchedule triggers: event created/updated/cancelled - Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automatisieren Sie Dateispeichervorgänge mit Google Cloud Storage. Hochladen, herunterladen, Eimer verwalten, Berechtigungen einstellen und Änderungen mit Echtzeit-Triggern überwachen.",
|
||||
"Create Bucket": "Bucket erstellen",
|
||||
"Delete Empty Bucket": "Leere Gruppe löschen",
|
||||
"Clone Object": "Objekt klonen",
|
||||
"Delete Object": "Objekt löschen",
|
||||
"Search Objects": "Objekte suchen",
|
||||
"Search Buckets": "Buckets durchsuchen",
|
||||
"Create Object ACL": "Objekt-ACL erstellen",
|
||||
"Delete Object ACL": "Objekt-ACL löschen",
|
||||
"Create Bucket ACL": "Bucket ACL erstellen",
|
||||
"Delete Bucket ACL": "Bucket ACL löschen",
|
||||
"Create Bucket Default Object ACL": "Erstelle Eimer Standard-Objekt-ACL",
|
||||
"Delete Bucket Default Object ACL": "Eimer Standard-Objekt-ACL löschen",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Erstellen Sie eine neue Gruppe an einer bestimmten Stelle/Konfiguration. Perfekt für die Automatisierung der Speicherbereitstellung für neue Projekte.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Bereinigen Sie ungenutzte Eimer indem Sie sie löschen, wenn sie keine Live-Objekte enthalten.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Kopieren / klonen Sie ein Objekt (Datei) an einen neuen Ort (gleiche oder andere Gruppe), optional überschreiben Sie Metadaten. Perfekt um Dateien als Backup oder Version zu duplizieren.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Lösche dauerhaft ein bestimmtes Objekt. Perfekt um veraltete Dateien zu entfernen.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Suche Objekte nach Kriterien. Perfekt um Dateien in der Gruppe zu finden.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Suchen Sie Eimer nach Namen. Perfekt, um Eimer in Ihrem Projekt zu finden.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Fügen Sie einem Objekt einen ACL-Eintrag hinzu (erteilen Sie eine Berechtigung). Perfekt um einem Benutzer oder einer Gruppe Lese- und Schreibzugriff zu gewähren.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Entferne einen ACL-Eintrag aus einem Objekt. Perfekt um den Zugriff eines Benutzers zu widerrufen.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Fügen Sie einen ACL-Eintrag auf Eimerebene hinzu. Perfekt um die Berechtigung zur Verwaltung der Gruppe zu erteilen.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Entferne einen ACL-Eintrag aus einem Bucket. Perfekt um den Zugriff eines Benutzers oder einer Gruppe zu widerrufen.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Legen Sie Standard-ACLs für neue Objekte fest, die einer Gruppe hinzugefügt wurden. Perfekt für die automatische Zuweisung von Berechtigungen an neue Uploads.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Entferne die Standard-ACL-Einstellungen aus einem Bucket. Perfekt, um zum Standardverhalten zurückzukehren.",
|
||||
"Project": "Projekt",
|
||||
"Bucket Name": "Bucket-Name",
|
||||
"Location": "Standort",
|
||||
"Storage Class": "Speicherklasse",
|
||||
"Enable Versioning": "Versionierung aktivieren",
|
||||
"Uniform Bucket Level Access": "Einheitlicher Bucket Level Zugriff",
|
||||
"Labels": "Etiketten",
|
||||
"Bucket": "Eimer",
|
||||
"Object": "Objekt",
|
||||
"Destination Object Name": "Zielobjektname",
|
||||
"Metadata Overrides": "Metadaten überschreiben",
|
||||
"Generation": "Generierung",
|
||||
"Prefix": "Präfix",
|
||||
"Glob Pattern": "Glob-Muster",
|
||||
"Delimiter": "Trennzeichen",
|
||||
"Include Folders": "Ordner einbeziehen",
|
||||
"Include Versions": "Versionen einbeziehen",
|
||||
"Page Token": "Seiten-Token",
|
||||
"Max Results": "Maximale Ergebnisse",
|
||||
"Name Prefix": "Name Präfix",
|
||||
"Include Soft-Deleted": "Soft-Deleted einbeziehen",
|
||||
"Projection": "Projektion",
|
||||
"Entity": "Entität",
|
||||
"Role": "Rolle",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Eindeutiger Name für Ihre Gruppe (muss global einzigartig sein, 3-63 Zeichen)",
|
||||
"Key-value pairs for bucket labels": "Schlüssel-Wert-Paare für Bucket-Labels",
|
||||
"Name for the copied object (must be valid object name)": "Name für das kopierte Objekt (muss ein gültiger Objektname sein)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Optionale Metadaten und Eigenschaften, die im kopierten Objekt überschrieben werden sollen (contentType, cacheControl, contentDisposition, etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Optionale Generierungsnummer für versionierte Objekte (löscht permanent eine bestimmte Revision)",
|
||||
"Filter objects whose names begin with this prefix": "Objekte filtern, deren Namen mit diesem Präfix beginnen",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Globe Muster um Ergebnisse zu filtern (z.B. \"Ordner/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Trennzeichen für hierarchische Auflistung (üblicherweise \"/\")",
|
||||
"Include empty folders and managed folders in results": "Leere Ordner und verwaltete Ordner in Ergebnisse einfügen",
|
||||
"List all versions of objects as distinct results": "Alle Versionen von Objekten als eindeutige Ergebnisse auflisten",
|
||||
"Token for pagination (from previous response)": "Token für Paginierung (von vorheriger Antwort)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Maximale Anzahl der zurückzugebenden Objekte (empfohlen: <unk> 1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Gruppen filtern, deren Namen mit diesem Präfix beginnen",
|
||||
"Include soft-deleted bucket versions in results": "Soft-gelöschte Bucket-Versionen in Ergebnisse einbeziehen",
|
||||
"Set of properties to return": "Anzahl der zurückzugebenden Eigenschaften",
|
||||
"Maximum number of buckets to return": "Maximale Anzahl der Rückgabewerte",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "Die Entität, auf die Zugriff gewährt werden soll. Muss den Entitätstyp Präfix enthalten. Format: Benutzer-E-Mail-Adresse, Gruppen-E-Mail-Adresse, Gruppen-E-Mail-Adresse, Domain-DomainName, project-team-projectId, allBenutzer oder allAuthenticatedUsers. Beispiele: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Optionale Generierungsnummer für versionierte Objekte",
|
||||
"US (Multi-region)": "USA (Multi-Region)",
|
||||
"EU (Multi-region)": "EU (Multi-Region)",
|
||||
"ASIA (Multi-region)": "ASIA (Multi-Region)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (South Carolina)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Nördliche Virginia)",
|
||||
"us-west1 (Oregon)": "us-west1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (Salt Lake City)",
|
||||
"us-west4 (Las Vegas)": "us-West4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "us-Süden1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "europe-central2 (Warschau)",
|
||||
"europe-north1 (Finland)": "europe-north1 (Finnland)",
|
||||
"europe-southwest1 (Madrid)": "europ-Südwest1 (Madrid)",
|
||||
"europe-west1 (Belgium)": "europe-west1 (Belgien)",
|
||||
"europe-west2 (London)": "europe-west2 (London)",
|
||||
"europe-west3 (Frankfurt)": "europe-west3 (Frankfurt)",
|
||||
"europe-west4 (Netherlands)": "europe-west4 (Niederlande)",
|
||||
"europe-west6 (Zurich)": "europe-west6 (Zürich)",
|
||||
"europe-west8 (Milan)": "europe-west8 (Mailand)",
|
||||
"europe-west9 (Paris)": "europe-west9 (Paris)",
|
||||
"asia-east1 (Taiwan)": "asia-east1 (Taiwan)",
|
||||
"asia-east2 (Hong Kong)": "asia-east2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-nordost1 (Tokyo)",
|
||||
"asia-northeast2 (Osaka)": "asia-nordost2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-nordost3 (Seoul)",
|
||||
"asia-south1 (Mumbai)": "asia-süd1 (Mumbai)",
|
||||
"asia-south2 (Delhi)": "asia-south2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "asia-Südost1 (Singapur)",
|
||||
"asia-southeast2 (Jakarta)": "asia-Südost2 (Jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australia-Südost1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australia-Südost2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "nordamerica-Nordosten1 (Montreal)",
|
||||
"northamerica-northeast2 (Toronto)": "nordamerica-Nordosten2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "südamerikanisch-ost1 (Sa<unk> o Paulo)",
|
||||
"southamerica-west1 (Santiago)": "südamerikanisch-west1 (Santiago)",
|
||||
"Standard": "Standard",
|
||||
"Nearline": "Nächste Zeile",
|
||||
"Coldline": "Kaltlinie",
|
||||
"Archive": "Archivieren",
|
||||
"Multi-regional": "Mehrere Regionen",
|
||||
"Regional": "Regionale",
|
||||
"Durable Reduced Availability": "Dauerhaft reduzierte Verfügbarkeit",
|
||||
"No ACLs (faster)": "Keine ACLs (schneller)",
|
||||
"Full (includes ACLs)": "Voll (inklusive ACLs)",
|
||||
"Reader": "Leser",
|
||||
"Owner": "Besitzer",
|
||||
"Writer": "Schriftsteller",
|
||||
"New Object Created": "Neues Objekt erstellt",
|
||||
"Object Updated": "Objekt aktualisiert",
|
||||
"Triggers when a new object is created in a bucket": "Löst aus, wenn ein neues Objekt in einer Gruppe erstellt wird",
|
||||
"Triggers when an existing object is updated in a bucket": "Wird ausgelöst, wenn ein existierendes Objekt in einer Gruppe aktualisiert wird",
|
||||
"Prefix Filter": "Präfix Filter",
|
||||
"Only trigger for objects with this prefix": "Nur für Objekte mit diesem Präfix auslösen"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automatiza las operaciones de almacenamiento de archivos con Google Cloud Storage. Subir, descargar, administrar cuquetes, establecer permisos y supervisar los cambios con activadores en tiempo real.",
|
||||
"Create Bucket": "Crear cubo",
|
||||
"Delete Empty Bucket": "Eliminar cubo vacío",
|
||||
"Clone Object": "Clonar objeto",
|
||||
"Delete Object": "Eliminar objeto",
|
||||
"Search Objects": "Buscar objetos",
|
||||
"Search Buckets": "Buscar cubos",
|
||||
"Create Object ACL": "Crear ACL del objeto",
|
||||
"Delete Object ACL": "Eliminar ACL del objeto",
|
||||
"Create Bucket ACL": "Crear cubo ACL",
|
||||
"Delete Bucket ACL": "Eliminar cubo ACL",
|
||||
"Create Bucket Default Object ACL": "Crear la ACL del cubo por defecto",
|
||||
"Delete Bucket Default Object ACL": "Eliminar la ACL del cubo por defecto",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Crear un nuevo cubo en una ubicación/configuración especificada. Perfecto para automatizar la provisión de almacenamiento para nuevos proyectos.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Limpia los cubos no utilizados eliminándolos si no contienen objetos en vivo.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Copiar / clonar un objeto (archivo) a una nueva ubicación (mismo o diferente cubo), opcionalmente sobrescribir metadatos. Perfecto para duplicar archivos como copia de seguridad o versión.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Eliminar permanentemente un objeto específico. Perfecto para eliminar archivos obsoletos.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Busca objetos por criterios. Perfecto para encontrar archivos en tu cubeta.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Busca cubos por nombre. Perfecto para encontrar cubos en tu proyecto.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Agrega una entrada ACL a un objeto (concede un permiso). Perfecto para conceder acceso de lectura/escritura a un usuario o grupo.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Remueve una entrada ACL de un objeto. Perfecto para revocar el acceso de un usuario.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Agrega una entrada ACL a nivel de cubeta. Perfecto para conceder permiso para gestionar la cubeta.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Elimina una entrada ACL de un bucket. Perfecto para revocar el acceso para un usuario o grupo.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Establece las ACLs por defecto para los nuevos objetos añadidos a un paquete. Perfecto para asignar automáticamente permisos a nuevas subidas.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Elimina la configuración predeterminada de ACL. Perfecto para revertir al comportamiento predeterminado.",
|
||||
"Project": "Projekt",
|
||||
"Bucket Name": "Nombre del cubo",
|
||||
"Location": "Ubicación",
|
||||
"Storage Class": "Clase de almacenamiento",
|
||||
"Enable Versioning": "Activar Versionado",
|
||||
"Uniform Bucket Level Access": "Acceso uniforme al nivel del cubo",
|
||||
"Labels": "Etiquetas",
|
||||
"Bucket": "Cubo",
|
||||
"Object": "Objeto",
|
||||
"Destination Object Name": "Nombre del objeto destino",
|
||||
"Metadata Overrides": "Reemplazo de metadatos",
|
||||
"Generation": "Generación",
|
||||
"Prefix": "Prefijo",
|
||||
"Glob Pattern": "Patrón de Glob",
|
||||
"Delimiter": "Delimitador",
|
||||
"Include Folders": "Incluye Carpetas",
|
||||
"Include Versions": "Incluye versiones",
|
||||
"Page Token": "Ficha de página",
|
||||
"Max Results": "Resultados máximos",
|
||||
"Name Prefix": "Prefijo Nombre",
|
||||
"Include Soft-Deleted": "Incluye Soft-Deleted",
|
||||
"Projection": "Proyección",
|
||||
"Entity": "Entidad",
|
||||
"Role": "Rol",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Nombre único para tu cubo (debe ser único globalmente, de 3-63 caracteres)",
|
||||
"Key-value pairs for bucket labels": "Pares de valor clave para etiquetas de cubo",
|
||||
"Name for the copied object (must be valid object name)": "Nombre del objeto copiado (debe ser un nombre de objeto válido)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Metadatos y propiedades opcionales para sobreescribir en el objeto copiado (contentType, cacheControl, contentDisposition, etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Número de generación opcional para objetos versionados (elimina permanentemente una revisión específica)",
|
||||
"Filter objects whose names begin with this prefix": "Filtrar objetos cuyos nombres comienzan con este prefijo",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Patrón de glob para filtrar resultados (por ejemplo, \"carpeta/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Delimitador para la lista jerárquica (comúnmente \"/\")",
|
||||
"Include empty folders and managed folders in results": "Incluye carpetas vacías y carpetas administradas en los resultados",
|
||||
"List all versions of objects as distinct results": "Listar todas las versiones de los objetos como resultados distintos",
|
||||
"Token for pagination (from previous response)": "Token de paginación (de respuesta anterior)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Número máximo de objetos a retornar (recomendado/a: ► 1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Filtrar cubos cuyos nombres comienzan con este prefijo",
|
||||
"Include soft-deleted bucket versions in results": "Incluye versiones de cubo eliminadas en los resultados",
|
||||
"Set of properties to return": "Conjunto de propiedades a devolver",
|
||||
"Maximum number of buckets to return": "Número máximo de cubos a devolver",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "La entidad a la que conceder acceso. Debe incluir el prefijo de tipo de entidad. Formato: usuario-emailAdress, group-group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Ejemplos: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Número de generación opcional para objetos versionados",
|
||||
"US (Multi-region)": "EEUU (Multiregión)",
|
||||
"EU (Multi-region)": "UE (Multiregión)",
|
||||
"ASIA (Multi-region)": "ASIA (Multiregión)",
|
||||
"us-central1 (Iowa)": "Central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "mañana1 (Carolina del Sur)",
|
||||
"us-east4 (Northern Virginia)": "EU-Este 4 (Virgina del Norte)",
|
||||
"us-west1 (Oregon)": "-Oeste 1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "-Oest2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "☆ Oest3 (Salt Lake City)",
|
||||
"us-west4 (Las Vegas)": "-Oest4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "EU-sur 1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "Europa-central2 (Varsovia)",
|
||||
"europe-north1 (Finland)": "Europa-norte1 (Finlandia)",
|
||||
"europe-southwest1 (Madrid)": "Europa-sudoest1 (ído)",
|
||||
"europe-west1 (Belgium)": "Europa-oest1 (Bélgica)",
|
||||
"europe-west2 (London)": "Europa-oest2 (Londres)",
|
||||
"europe-west3 (Frankfurt)": "Europa-Oest3 (Izquierda)",
|
||||
"europe-west4 (Netherlands)": "Europa-Oest4 (Tierra)",
|
||||
"europe-west6 (Zurich)": "Europa-Oest6 (Zurich)",
|
||||
"europe-west8 (Milan)": "Europa-Oest8 (Milán)",
|
||||
"europe-west9 (Paris)": "Europe-west9 (Paris)",
|
||||
"asia-east1 (Taiwan)": "asia-este1 (Taiwán)",
|
||||
"asia-east2 (Hong Kong)": "asia-este2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-noreste1 (Tokyo)",
|
||||
"asia-northeast2 (Osaka)": "asia-noreste 2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-noreste 3 (Seoul)",
|
||||
"asia-south1 (Mumbai)": "asia-sur1 (Mumbai)",
|
||||
"asia-south2 (Delhi)": "asia-sur2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "asia-sureste 1 (Singapore)",
|
||||
"asia-southeast2 (Jakarta)": "asia-sudeste 2 (Jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australia-sudeste1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australia-sudeste 2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "Norteamerica-noreste1 (Montreal)",
|
||||
"northamerica-northeast2 (Toronto)": "Norteamerica-noreste 2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "Sudamérica-Este1 (Saúl Paulo)",
|
||||
"southamerica-west1 (Santiago)": "suramérica-oest1 (Santiago)",
|
||||
"Standard": "Estándar",
|
||||
"Nearline": "Cercano",
|
||||
"Coldline": "Línea fría",
|
||||
"Archive": "Archivar",
|
||||
"Multi-regional": "Multi-regional",
|
||||
"Regional": "Regional",
|
||||
"Durable Reduced Availability": "Discapacidad reducida durable",
|
||||
"No ACLs (faster)": "Sin ACLs (más rápido)",
|
||||
"Full (includes ACLs)": "Completo (incluye ACLs)",
|
||||
"Reader": "Lector",
|
||||
"Owner": "Propietario",
|
||||
"Writer": "Escritor",
|
||||
"New Object Created": "Nuevo objeto creado",
|
||||
"Object Updated": "Objeto actualizado",
|
||||
"Triggers when a new object is created in a bucket": "Dispara cuando se crea un nuevo objeto en un cubo",
|
||||
"Triggers when an existing object is updated in a bucket": "Dispara cuando se actualiza un objeto existente en un cubo",
|
||||
"Prefix Filter": "Filtro de prefijo",
|
||||
"Only trigger for objects with this prefix": "Sólo disparador para objetos con este prefijo"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automatisez les opérations de stockage de fichiers avec Google Cloud Storage. Téléchargez, téléchargez, gérez les segments, définissez les autorisations et surveillez les changements avec des déclencheurs en temps réel.",
|
||||
"Create Bucket": "Créer un seau",
|
||||
"Delete Empty Bucket": "Supprimer le seau vide",
|
||||
"Clone Object": "Cloner l'objet",
|
||||
"Delete Object": "Supprimer l'objet",
|
||||
"Search Objects": "Rechercher des objets",
|
||||
"Search Buckets": "Rechercher des seaux",
|
||||
"Create Object ACL": "Créer un objet ACL",
|
||||
"Delete Object ACL": "Supprimer les ACL de l'objet",
|
||||
"Create Bucket ACL": "Créer un seau ACL",
|
||||
"Delete Bucket ACL": "Supprimer le seau ACL",
|
||||
"Create Bucket Default Object ACL": "Créer une ACL d'objet par défaut",
|
||||
"Delete Bucket Default Object ACL": "Supprimer l'objet ACL par défaut du seau",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Créez un nouveau compartiment dans un emplacement ou une configuration spécifiés. Idéal pour automatiser le provisionnement de stockage pour de nouveaux projets.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Nettoyez les segments inutilisés en les supprimant s'ils ne contiennent aucun objet vivant.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Copiez / clonez un objet (fichier) vers un nouvel emplacement (même ou autre compartiment), éventuellement écrasant les métadonnées. Idéal pour dupliquer des fichiers en tant que sauvegarde ou version.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Supprime définitivement un objet spécifique. Idéal pour supprimer les fichiers obsolètes.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Recherche d'objets par critère. Parfait pour trouver des fichiers dans votre seau.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Rechercher des seaux par nom. Parfait pour trouver des segments dans votre projet.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Ajouter une entrée ACL à un objet (accorder une permission). Parfait pour accorder un accès en lecture/écriture à un utilisateur ou à un groupe.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Retirer une entrée ACL d'un objet. Parfait pour révoquer l'accès pour un utilisateur.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Ajouter une entrée ACL au niveau du segment. Idéal pour accorder la permission de gérer le segment.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Retirer une entrée ACL d'un segment. Parfait pour révoquer l'accès pour un utilisateur ou un groupe.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Définir les ACLs par défaut pour les nouveaux objets ajoutés à un segment. Parfait pour assigner automatiquement les permissions aux nouveaux téléchargements.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Retirer les paramètres ACL par défaut d'un segment. Parfait pour revenir au comportement par défaut.",
|
||||
"Project": "Votre compte",
|
||||
"Bucket Name": "Nom du seau",
|
||||
"Location": "Localisation",
|
||||
"Storage Class": "Classe de stockage",
|
||||
"Enable Versioning": "Activer le Versioning",
|
||||
"Uniform Bucket Level Access": "Accès au niveau du seau uniforme",
|
||||
"Labels": "Étiquettes",
|
||||
"Bucket": "Seau",
|
||||
"Object": "Objet",
|
||||
"Destination Object Name": "Nom de l'objet de destination",
|
||||
"Metadata Overrides": "Substitutions de métadonnées",
|
||||
"Generation": "Générer",
|
||||
"Prefix": "Préfixe",
|
||||
"Glob Pattern": "Schéma du globe",
|
||||
"Delimiter": "Délimiteur",
|
||||
"Include Folders": "Inclure les dossiers",
|
||||
"Include Versions": "Inclure les versions",
|
||||
"Page Token": "Jeton de la page",
|
||||
"Max Results": "Nombre maximum de résultats",
|
||||
"Name Prefix": "Préfixe de nom",
|
||||
"Include Soft-Deleted": "Inclure Soft-Supprimé",
|
||||
"Projection": "Projection",
|
||||
"Entity": "Entité",
|
||||
"Role": "Rôle",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Nom unique pour votre segment (doit être globalement unique, de 3 à 63 caractères)",
|
||||
"Key-value pairs for bucket labels": "Paires de valeur clé pour les étiquettes de compartiments",
|
||||
"Name for the copied object (must be valid object name)": "Nom de l'objet copié (doit être un nom d'objet valide)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Métadonnées et propriétés optionnelles à remplacer dans l'objet copié (contentType, cacheControl, contentDisposition, etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Numéro de génération optionnel pour les objets versionnés (supprime définitivement une révision spécifique)",
|
||||
"Filter objects whose names begin with this prefix": "Filtrer les objets dont le nom commence par ce préfixe",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Modèle de Glob pour filtrer les résultats (par exemple, \"dossier/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Délimiteur pour la liste hiérarchique (communément \"/\")",
|
||||
"Include empty folders and managed folders in results": "Inclure les dossiers vides et les dossiers gérés dans les résultats",
|
||||
"List all versions of objects as distinct results": "Liste toutes les versions des objets sous forme de résultats distincts",
|
||||
"Token for pagination (from previous response)": "Jeton pour la pagination (à partir de la réponse précédente)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Nombre maximum d'objets à retourner (recommandé: <unk> 1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Filtrer les segments dont les noms commencent par ce préfixe",
|
||||
"Include soft-deleted bucket versions in results": "Inclure les versions de bucket supprimées par le logiciel dans les résultats",
|
||||
"Set of properties to return": "Ensemble de propriétés à retourner",
|
||||
"Maximum number of buckets to return": "Nombre maximum de segments à renvoyer",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "L'entité à qui accorder l'accès. Doit inclure le préfixe de type d'entité. Format: adresse e-mail utilisateur, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, ou allAuthenticatedUsers. Exemples: user-liz@example.com, group-mygroup@googlegroups.com, domain-exemple.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Numéro de génération optionnel pour les objets versionnés",
|
||||
"US (Multi-region)": "US (Multi-région)",
|
||||
"EU (Multi-region)": "UE (Multi-région)",
|
||||
"ASIA (Multi-region)": "ASIA (Multi-région)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (Caroline du Sud)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Virginie du Nord)",
|
||||
"us-west1 (Oregon)": "us-west1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (Salt Lake City)",
|
||||
"us-west4 (Las Vegas)": "us-west4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "us-south1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "Europe-central2 (Varsovie)",
|
||||
"europe-north1 (Finland)": "Europe-Nord1 (Finlande)",
|
||||
"europe-southwest1 (Madrid)": "europe-sud-ouest1 (Madrid)",
|
||||
"europe-west1 (Belgium)": "europe-ouest1 (Belgique)",
|
||||
"europe-west2 (London)": "Europe-Ouest2 (Londres)",
|
||||
"europe-west3 (Frankfurt)": "europe-ouest3 (Francfort)",
|
||||
"europe-west4 (Netherlands)": "europe-ouest4 (Pays-Bas)",
|
||||
"europe-west6 (Zurich)": "europe-ouest6 (Zurich)",
|
||||
"europe-west8 (Milan)": "europe-ouest8 (Milan)",
|
||||
"europe-west9 (Paris)": "europe-ouest9 (Paris)",
|
||||
"asia-east1 (Taiwan)": "asia-east1 (Taïwan)",
|
||||
"asia-east2 (Hong Kong)": "asia-east2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-nord-est1 (Tokyo)",
|
||||
"asia-northeast2 (Osaka)": "asia-nord-est2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-nord-est3 (Séoul)",
|
||||
"asia-south1 (Mumbai)": "asia-sud1 (Mumbai)",
|
||||
"asia-south2 (Delhi)": "asia-sud2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "asia-sud-est1 (Singapore)",
|
||||
"asia-southeast2 (Jakarta)": "asia-sud-est2 (Jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australie-sud-sud-est 1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australie-sud-est2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "nord-américaine-nord-nord-est1 (Montréal)",
|
||||
"northamerica-northeast2 (Toronto)": "nord-américaine-nord-nord-est2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "sud-america-east1 (Sa<unk> o Paulo)",
|
||||
"southamerica-west1 (Santiago)": "sud-américaine-ouest1 (Santiago)",
|
||||
"Standard": "Standard",
|
||||
"Nearline": "À proximité",
|
||||
"Coldline": "Ligne froide",
|
||||
"Archive": "Archiver",
|
||||
"Multi-regional": "Multi-régionaux",
|
||||
"Regional": "Régional",
|
||||
"Durable Reduced Availability": "Réduction de la disponibilité durable",
|
||||
"No ACLs (faster)": "Aucune ACLs (plus rapide)",
|
||||
"Full (includes ACLs)": "Plein (comprend les ACLs)",
|
||||
"Reader": "Lecteur",
|
||||
"Owner": "Propriétaire",
|
||||
"Writer": "Écrivain",
|
||||
"New Object Created": "Nouvel objet créé",
|
||||
"Object Updated": "Objet mis à jour",
|
||||
"Triggers when a new object is created in a bucket": "Déclenche lorsqu'un nouvel objet est créé dans un compartiment",
|
||||
"Triggers when an existing object is updated in a bucket": "Déclenche lorsqu'un objet existant est mis à jour dans un compartiment",
|
||||
"Prefix Filter": "Filtre de préfixe",
|
||||
"Only trigger for objects with this prefix": "Ne déclencher que pour les objets avec ce préfixe"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Google Cloud Storageを使用してファイルストレージ操作を自動化します。リアルタイムトリガーを使用して、アップロード、ダウンロード、バケット管理、権限の設定、変更の監視を行います。",
|
||||
"Create Bucket": "バケットを作成",
|
||||
"Delete Empty Bucket": "空のバケットを削除",
|
||||
"Clone Object": "オブジェクトを複製",
|
||||
"Delete Object": "オブジェクトを削除",
|
||||
"Search Objects": "オブジェクトを検索",
|
||||
"Search Buckets": "バケツを検索",
|
||||
"Create Object ACL": "オブジェクトの ACL を作成",
|
||||
"Delete Object ACL": "オブジェクトの ACL を削除",
|
||||
"Create Bucket ACL": "Bucket の ACL を作成",
|
||||
"Delete Bucket ACL": "Bucket の ACL を削除",
|
||||
"Create Bucket Default Object ACL": "Bucket Default Object ACL の作成",
|
||||
"Delete Bucket Default Object ACL": "バケットのデフォルトオブジェクトのACLを削除",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "指定された場所/構成に新しいバケットを作成します。新しいプロジェクトのストレージプロビジョニングを自動化するのに最適です。",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "ライブオブジェクトが含まれていない場合は、未使用のバケットを削除してクリーンアップします。",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "オブジェクト(ファイル)を新しい場所(同じまたは別のバケット)にコピー/クローンし、必要に応じてメタデータを上書きします。バックアップまたはバージョンとしてファイルを複製するのに最適です。",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "特定のオブジェクトを完全に削除します。古いファイルを削除するのに最適です。",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "条件でオブジェクトを検索します。Bucket 内のファイルを検索するのに最適です。",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "名前でバケットを検索します。プロジェクトでバケットを見つけるのに最適です。",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "オブジェクトにACLエントリを追加します(権限を付与します)。ユーザーまたはグループへの読み取り/書き込みアクセスを許可するのに最適です。",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "オブジェクトからACLエントリを削除します。ユーザーのアクセスを取り消すのに最適です。",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Bucket レベルで ACL エントリーを追加します。Bucket を管理する権限を付与するのに最適です。",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Bucket からの ACL エントリーを削除します。ユーザーまたはグループへのアクセスを取り消すのに最適です。",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "新しいオブジェクトに追加されたBucketにデフォルトのACLを設定します。新しいアップロードに権限を自動的に割り当てるのに最適です。",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "デフォルトの ACL 設定をバケットから削除します。デフォルトの動作に戻すのに最適です。",
|
||||
"Project": "プロジェクト",
|
||||
"Bucket Name": "バケット名",
|
||||
"Location": "場所",
|
||||
"Storage Class": "ストレージクラス",
|
||||
"Enable Versioning": "バージョン管理を有効にする",
|
||||
"Uniform Bucket Level Access": "ユニフォームバケットレベル アクセス",
|
||||
"Labels": "ラベル",
|
||||
"Bucket": "バケツ入りバケツ",
|
||||
"Object": "オブジェクト",
|
||||
"Destination Object Name": "保存先オブジェクト名",
|
||||
"Metadata Overrides": "メタデータの上書き",
|
||||
"Generation": "生成",
|
||||
"Prefix": "プレフィックス",
|
||||
"Glob Pattern": "グローブパターン",
|
||||
"Delimiter": "区切り文字",
|
||||
"Include Folders": "フォルダを含める",
|
||||
"Include Versions": "バージョンを含める",
|
||||
"Page Token": "ページ トークン",
|
||||
"Max Results": "最大結果",
|
||||
"Name Prefix": "プレフィックス名",
|
||||
"Include Soft-Deleted": "ソフト削除を含める",
|
||||
"Projection": "投影図",
|
||||
"Entity": "エンティティ",
|
||||
"Role": "ロール",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "バケツのユニークな名前(3〜63文字でなければなりません)",
|
||||
"Key-value pairs for bucket labels": "バケットラベルのキーと値のペア",
|
||||
"Name for the copied object (must be valid object name)": "コピーしたオブジェクトの名前(有効なオブジェクト名でなければなりません)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "コピーされたオブジェクト(contentType、cacheControl、contentDispositionなど)で上書きするオプションのメタデータとプロパティ。",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "バージョン管理オブジェクトのオプション生成番号(特定のリビジョンを永久に削除します)",
|
||||
"Filter objects whose names begin with this prefix": "名前がこのプレフィックスで始まるオブジェクトをフィルター",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "検索結果をフィルタするためのグローブパターン (例: \"フォルダ/*\"、\"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "階層リストの区切り文字 (通常 \"/\")",
|
||||
"Include empty folders and managed folders in results": "空のフォルダと管理フォルダを結果に含める",
|
||||
"List all versions of objects as distinct results": "すべてのバージョンのオブジェクトを個別の結果としてリストする",
|
||||
"Token for pagination (from previous response)": "ページネーション用のトークン(以前の応答から)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "返すオブジェクトの最大数(推奨:1000以下)",
|
||||
"Filter buckets whose names begin with this prefix": "名前がこのプレフィックスで始まるバケツをフィルター",
|
||||
"Include soft-deleted bucket versions in results": "ソフト削除されたバケットバージョンを結果に含める",
|
||||
"Set of properties to return": "返すプロパティのセット",
|
||||
"Maximum number of buckets to return": "返却するバケツの最大数",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "アクセスを許可するエンティティ。エンティティタイプのプレフィックスを含める必要があります。フォーマット: user-emailAddress, group-groupId, group-emailAddress, domain-Name, project-team-projectId, allUsers, allAuthenticatedUsers. 例: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "バージョン管理オブジェクトのオプション生成番号",
|
||||
"US (Multi-region)": "アメリカ (マルチ地域)",
|
||||
"EU (Multi-region)": "EU (マルチリージョン)",
|
||||
"ASIA (Multi-region)": "アジア (マルチ地域)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (サウスカロライナ州)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Northern Virginia)",
|
||||
"us-west1 (Oregon)": "us-west1 (オレゴン)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (ロサンゼルス)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (塩湖市)",
|
||||
"us-west4 (Las Vegas)": "us-west4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "us-south1 (ダラス)",
|
||||
"europe-central2 (Warsaw)": "Europe-central2 (ワルシャワ)",
|
||||
"europe-north1 (Finland)": "europe-north1 (フィンランド)",
|
||||
"europe-southwest1 (Madrid)": "ヨーロッパ-南西1 (マドリード)",
|
||||
"europe-west1 (Belgium)": "Europe-west1 (ベルギー)",
|
||||
"europe-west2 (London)": "Europe-west2 (ロンドン)",
|
||||
"europe-west3 (Frankfurt)": "Europe-west3 (フランクフルト)",
|
||||
"europe-west4 (Netherlands)": "ヨーロッパ西部4(オランダ)",
|
||||
"europe-west6 (Zurich)": "Europe-west6 (チューリッヒ)",
|
||||
"europe-west8 (Milan)": "Europe-west8 (ミラノ)",
|
||||
"europe-west9 (Paris)": "Europe-west9 (パリ)",
|
||||
"asia-east1 (Taiwan)": "asia-east1 (台湾)",
|
||||
"asia-east2 (Hong Kong)": "asia-east2 (香港)",
|
||||
"asia-northeast1 (Tokyo)": "Asia-Northeast1(東京)",
|
||||
"asia-northeast2 (Osaka)": "アジア北東部2(大阪)",
|
||||
"asia-northeast3 (Seoul)": "asia-Northaast3 (ソウル)",
|
||||
"asia-south1 (Mumbai)": "asia-south1 (ムンバイ)",
|
||||
"asia-south2 (Delhi)": "asia-south2(デリー)",
|
||||
"asia-southeast1 (Singapore)": "Asia-Southast1 (シンガポール)",
|
||||
"asia-southeast2 (Jakarta)": "アジア南東2(ジャカルタ)",
|
||||
"australia-southeast1 (Sydney)": "オーストラリア南東1(シドニー)",
|
||||
"australia-southeast2 (Melbourne)": "australia-Southast2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "北アメリカ-北東部1 (モントリオール)",
|
||||
"northamerica-northeast2 (Toronto)": "北アメリカ-北東部2 (トロント)",
|
||||
"southamerica-east1 (São Paulo)": "Southerea-east1 (Safelo Paulo)",
|
||||
"southamerica-west1 (Santiago)": "Southerea-west1 (サンティアゴ)",
|
||||
"Standard": "標準",
|
||||
"Nearline": "<unk>",
|
||||
"Coldline": "Coldline",
|
||||
"Archive": "アーカイブ",
|
||||
"Multi-regional": "複数地域",
|
||||
"Regional": "地域",
|
||||
"Durable Reduced Availability": "耐久値の減少",
|
||||
"No ACLs (faster)": "アクセス制御リストなし (高速)",
|
||||
"Full (includes ACLs)": "フル (ACL を含む)",
|
||||
"Reader": "リーダー",
|
||||
"Owner": "所有者",
|
||||
"Writer": "Writer",
|
||||
"New Object Created": "新しいオブジェクトが作成されました",
|
||||
"Object Updated": "オブジェクトの更新",
|
||||
"Triggers when a new object is created in a bucket": "Bucket 内に新しいオブジェクトが作成されたときにトリガーする",
|
||||
"Triggers when an existing object is updated in a bucket": "Bucket 内で既存のオブジェクトが更新されたときにトリガーします",
|
||||
"Prefix Filter": "プレフィックスフィルタ",
|
||||
"Only trigger for objects with this prefix": "このプレフィックスを持つオブジェクトのトリガーのみ"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automatiseer bestandsopslag operaties met Google Cloud Storage. Uploaden, downloaden, buckets beheren, machtigingen instellen en wijzigingen bijhouden met real-time triggers.",
|
||||
"Create Bucket": "Emmer maken",
|
||||
"Delete Empty Bucket": "Verwijder lege Emmer",
|
||||
"Clone Object": "Dupliceer object",
|
||||
"Delete Object": "Object verwijderen",
|
||||
"Search Objects": "Zoek objecten",
|
||||
"Search Buckets": "Zoek Emmers",
|
||||
"Create Object ACL": "Object ACL aanmaken",
|
||||
"Delete Object ACL": "Object ACL verwijderen",
|
||||
"Create Bucket ACL": "Emmer ACL aanmaken",
|
||||
"Delete Bucket ACL": "Emmer ACL verwijderen",
|
||||
"Create Bucket Default Object ACL": "Bucket standaard object ACL maken",
|
||||
"Delete Bucket Default Object ACL": "Emmer standaard object ACL verwijderen",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Creëer een nieuwe emmer in een opgegeven locatie/configuratie. Perfect voor het automatiseren van opslag voor nieuwe projecten.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Maak ongebruikte emmers schoon door ze te verwijderen als ze geen live objecten bevatten.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Kopieer / kloon een object (bestand) naar een nieuwe locatie (zelfde of verschillende bucket), mogelijk metagegevens overschrijven. Perfect voor het dupliceren van bestanden als back-up of versie.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Verwijder permanent een specifiek object. Perfect voor het verwijderen van verouderde bestanden.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Zoek objecten op criteria. Perfect voor het vinden van bestanden in je bucket.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Doorzoek de emmers op naam. Perfect voor het vinden van emmers in je project.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Voeg een ACL invoer toe aan een object (verleen machtiging). Perfect voor het lezen/schrijven van een gebruiker of groep.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Verwijder een ACL invoer van een object. Perfect voor het intrekken van toegang voor een gebruiker.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Voeg een ACL invoer toe op bucket. Perfect om toestemming te geven om de emmer te beheren.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Verwijder een ACL invoer van een emmer. Perfect voor het intrekken van toegang voor een gebruiker of groep.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Stel standaard ACL's in voor nieuwe objecten die aan een emmer zijn toegevoegd. Perfect voor het automatisch toewijzen van rechten aan nieuwe uploads.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Verwijder de standaard ACL instellingen van een bucket. Perfect om terug te keren naar standaard gedrag.",
|
||||
"Project": "Project",
|
||||
"Bucket Name": "Bucket Naam",
|
||||
"Location": "Locatie",
|
||||
"Storage Class": "Opslag klasse",
|
||||
"Enable Versioning": "Versiebeheer inschakelen",
|
||||
"Uniform Bucket Level Access": "Uniform Bucket Level Toegang",
|
||||
"Labels": "Labels",
|
||||
"Bucket": "Emmer",
|
||||
"Object": "Object",
|
||||
"Destination Object Name": "Naam doelobject",
|
||||
"Metadata Overrides": "Metadata overschrijvingen",
|
||||
"Generation": "Genereren",
|
||||
"Prefix": "Voorvoegsel",
|
||||
"Glob Pattern": "Glob patroon",
|
||||
"Delimiter": "Scheidingsteken",
|
||||
"Include Folders": "Mappen toevoegen",
|
||||
"Include Versions": "Inclusief versies",
|
||||
"Page Token": "Pagina Token",
|
||||
"Max Results": "Max. aantal resultaten",
|
||||
"Name Prefix": "Naam voorvoegsel",
|
||||
"Include Soft-Deleted": "Soft-Deleted opnemen",
|
||||
"Projection": "Projectie",
|
||||
"Entity": "Entiteit",
|
||||
"Role": "Functie",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Unieke naam voor je emmer (moet globaal uniek, 3-63 tekens zijn)",
|
||||
"Key-value pairs for bucket labels": "Sleutelwaarde paren voor emmer labels",
|
||||
"Name for the copied object (must be valid object name)": "Naam voor het gekopieerde object (moet een geldige objectnaam zijn)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Optionele metagegevens en eigenschappen om te overschrijven van het gekopieerde object (contenttype, cachecontrole, contentDisposition etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Optioneel generatienummer voor versieobjecten (verwijdert permanent een specifieke revisie)",
|
||||
"Filter objects whose names begin with this prefix": "Objecten filteren waarvan de namen beginnen met dit voorvoegsel",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Glob patroon om resultaten te filteren (bijv. \"map/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Scheidingsteken voor hiërarchische lijst (veel \"/\")",
|
||||
"Include empty folders and managed folders in results": "Lege mappen en beheerde mappen toevoegen aan de resultaten",
|
||||
"List all versions of objects as distinct results": "Toon alle versies van objecten als verschillende resultaten",
|
||||
"Token for pagination (from previous response)": "Token voor paginering (uit vorige reactie)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Maximaal aantal te retourneren objecten (aanbevolen: ≤ 1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Buckets filteren waarvan de namen beginnen met dit voorvoegsel",
|
||||
"Include soft-deleted bucket versions in results": "Inclusief soft-deleted bucket versies in resultaten",
|
||||
"Set of properties to return": "Set van eigenschappen om terug te keren",
|
||||
"Maximum number of buckets to return": "Maximum aantal emmers om te retourneren",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "De entiteit waar toegang tot moet worden verleend. Moet een entiteittype voorvoegsel voorvoegsel bevatten: user-emailadres, groep-group-groupId, groep-emailadress, domeinnam, project-team-projectId, allUsers, of allAuthenticatedUsers. Voorbeelden: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Optioneel generatienummer voor versieobjecten",
|
||||
"US (Multi-region)": "VS (meerdere regio)",
|
||||
"EU (Multi-region)": "EU (meerdere regio)",
|
||||
"ASIA (Multi-region)": "ASIA (multi-regio)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (Zuid Carolina)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Noordelijke Maaginia)",
|
||||
"us-west1 (Oregon)": "us-west1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (Kamer City)",
|
||||
"us-west4 (Las Vegas)": "us-west4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "us-Zuid-1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "europe-central2 (Warschau)",
|
||||
"europe-north1 (Finland)": "europe-noord1 (Finland)",
|
||||
"europe-southwest1 (Madrid)": "europe-zuidwest1 (Madrid)",
|
||||
"europe-west1 (Belgium)": "europe-west1 (België)",
|
||||
"europe-west2 (London)": "europe-west2 (London)",
|
||||
"europe-west3 (Frankfurt)": "europe-west3 (Frankfurt)",
|
||||
"europe-west4 (Netherlands)": "europe-west4 (Nederland)",
|
||||
"europe-west6 (Zurich)": "europe-west6 (Zurich)",
|
||||
"europe-west8 (Milan)": "europe-west8 (Milan)",
|
||||
"europe-west9 (Paris)": "europe-west9 (Parijs)",
|
||||
"asia-east1 (Taiwan)": "asia-east1 (Taiwan)",
|
||||
"asia-east2 (Hong Kong)": "asia-east2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-noordooast1 (Tokio)",
|
||||
"asia-northeast2 (Osaka)": "asia-noordoost2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-noordoost3 (Seoul)",
|
||||
"asia-south1 (Mumbai)": "asia-south1 (Mumba)",
|
||||
"asia-south2 (Delhi)": "asië-zuid2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "asia-zuidoost1 (Singapore)",
|
||||
"asia-southeast2 (Jakarta)": "jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australia-zuidoost1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australia-zuidoost2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "noord-noordoost1 (maand)",
|
||||
"northamerica-northeast2 (Toronto)": "noord-noordoost2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "southamerica-east1 (Saľo Paulo)",
|
||||
"southamerica-west1 (Santiago)": "zuid-amerika-west1 (Santiago)",
|
||||
"Standard": "Standaard",
|
||||
"Nearline": "Nabijgelegen",
|
||||
"Coldline": "Koudelijn",
|
||||
"Archive": "Archief",
|
||||
"Multi-regional": "Multiregionale",
|
||||
"Regional": "Regionaal",
|
||||
"Durable Reduced Availability": "Duurzame verminderde beschikbaarheid",
|
||||
"No ACLs (faster)": "Geen ACL's (sneller)",
|
||||
"Full (includes ACLs)": "Volledig (inclusief ACLs)",
|
||||
"Reader": "Lezer",
|
||||
"Owner": "Eigenaar",
|
||||
"Writer": "Schrijver",
|
||||
"New Object Created": "Nieuw object gemaakt",
|
||||
"Object Updated": "Object bijgewerkt",
|
||||
"Triggers when a new object is created in a bucket": "Triggert wanneer een nieuw object is gemaakt in een emmer",
|
||||
"Triggers when an existing object is updated in a bucket": "Triggert wanneer een bestaand object in een emmer wordt bijgewerkt",
|
||||
"Prefix Filter": "Filter voorvoegsel",
|
||||
"Only trigger for objects with this prefix": "Alleen genereren voor objecten met dit voorvoegsel"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automatize as operações de armazenamento de arquivos com o Google Cloud Storage. Upload, download, gerencie buckets, configure permissões e monitore alterações com gatilhos em tempo real.",
|
||||
"Create Bucket": "Criar Balde",
|
||||
"Delete Empty Bucket": "Apagar Balde Vazio",
|
||||
"Clone Object": "Clonar objeto",
|
||||
"Delete Object": "Excluir Objeto",
|
||||
"Search Objects": "Pesquisar Objetos",
|
||||
"Search Buckets": "Pesquisar baldes",
|
||||
"Create Object ACL": "Criar objeto ACL",
|
||||
"Delete Object ACL": "Excluir objeto ACL",
|
||||
"Create Bucket ACL": "Criar Bucket ACL",
|
||||
"Delete Bucket ACL": "Excluir Bucket ACL",
|
||||
"Create Bucket Default Object ACL": "Criar Objeto ACL Padrão do Bucket",
|
||||
"Delete Bucket Default Object ACL": "Apagar Bucket Padrão do Objeto ACL",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Criar um novo balde em um local/configuração especificada. Perfeito para automatizar o provisionamento do armazenamento para novos projetos.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Limpe baldes não utilizados excluindo-os se não tiverem objetos ao vivo.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Copie / clone um objeto (arquivo) para um novo local (mesmo ou outro bucket), opcionalmente substituindo metadados. Perfeito para duplicar arquivos como backup ou versão.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Excluir permanentemente um objeto específico. Perfeito para remover arquivos obsoletos.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Pesquisar objetos por critérios. Perfeito para encontrar arquivos em seu bucket.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Procure baldes por nome. Perfeito para encontrar baldes em seu projeto.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Adicionar uma entrada de ACL a um objeto (conceder uma permissão). Perfeito para conceder acesso de leitura/gravação a um usuário ou grupo.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Remove uma entrada de ACL de um objeto. Perfeito para revogar acesso para um usuário.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Adicione uma entrada ACL no nível do bucket. Perfeito para conceder permissão para gerenciar o bucket.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Remove uma entrada de ACL de um bucket. Perfeito para revogar acesso para um usuário ou grupo.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Defina ACLs padrão para novos objetos adicionados a um bucket. Perfeito para atribuir automaticamente permissões a novos uploads.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Remover as configurações padrão de ACL de um bucket. Perfeito para reverter para o comportamento padrão.",
|
||||
"Project": "Projecto",
|
||||
"Bucket Name": "Nome do Balde",
|
||||
"Location": "Local:",
|
||||
"Storage Class": "Classe de Armazenamento",
|
||||
"Enable Versioning": "Habilitar versionamento",
|
||||
"Uniform Bucket Level Access": "Acesso ao nível de Balde Uniforme",
|
||||
"Labels": "Marcadores",
|
||||
"Bucket": "Balde",
|
||||
"Object": "Objeto",
|
||||
"Destination Object Name": "Nome do objeto destino",
|
||||
"Metadata Overrides": "Substituições de metadados",
|
||||
"Generation": "Geração",
|
||||
"Prefix": "Prefixo",
|
||||
"Glob Pattern": "Padrão de Globa",
|
||||
"Delimiter": "Delimitador",
|
||||
"Include Folders": "Incluir pastas",
|
||||
"Include Versions": "Incluir versões",
|
||||
"Page Token": "Token da Página",
|
||||
"Max Results": "Resultados no Máx.",
|
||||
"Name Prefix": "Prefixo do Nome",
|
||||
"Include Soft-Deleted": "Incluir Suavização",
|
||||
"Projection": "Projeção",
|
||||
"Entity": "Entidade",
|
||||
"Role": "Funções",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Nome exclusivo do seu balde (deve ser globalmente único, 3-63 caracteres)",
|
||||
"Key-value pairs for bucket labels": "Pares chave-valor para etiquetas de baldes",
|
||||
"Name for the copied object (must be valid object name)": "Nome para o objeto copiado (deve ser o nome do objeto válido)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Metadados e propriedades opcionais para substituir no objeto copiado (contentType, cacheControl, contentDisposition, etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Número de geração opcional para objetos de versão (exclui permanentemente uma revisão específica)",
|
||||
"Filter objects whose names begin with this prefix": "Filtrar objetos cujos nomes começam com este prefixo",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Padrão Glob para filtrar resultados (por exemplo, \"pasta/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Delimitador para listagem hierárquica (comumente \"/\")",
|
||||
"Include empty folders and managed folders in results": "Incluir pastas vazias e pastas gerenciadas nos resultados",
|
||||
"List all versions of objects as distinct results": "Listar todas as versões de objetos como resultados distintos",
|
||||
"Token for pagination (from previous response)": "Token para paginação (de resposta anterior)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Número máximo de objetos a retornar (recomendado: ≤1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Filtrar buckets cujos nomes começam com este prefixo",
|
||||
"Include soft-deleted bucket versions in results": "Incluir versões de bucket excluídas por software nos resultados",
|
||||
"Set of properties to return": "Conjunto de propriedades para retornar",
|
||||
"Maximum number of buckets to return": "Número máximo de baldes para devolver",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "A entidade para conceder acesso. Deve incluir o prefixo do tipo de entidade. Formato: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, ou allAuthenticatedUsers. Exemplos: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Número opcional de geração para objetos versionados",
|
||||
"US (Multi-region)": "US (Multi-região)",
|
||||
"EU (Multi-region)": "UE (Multi-região)",
|
||||
"ASIA (Multi-region)": "ASIA (multi-região)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (Carolina quadradina)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Virgínia do Norte)",
|
||||
"us-west1 (Oregon)": "us-west1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (Salt Lake City)",
|
||||
"us-west4 (Las Vegas)": "us-west4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "-Sul 1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "Europa-central2 (Varsóvia)",
|
||||
"europe-north1 (Finland)": "Europa-norte1 (Finlândia)",
|
||||
"europe-southwest1 (Madrid)": "Europa-sudoeste1 (Madrid)",
|
||||
"europe-west1 (Belgium)": "Europa-Oeste1 (Bélgica)",
|
||||
"europe-west2 (London)": "Europa-west2 (Londres)",
|
||||
"europe-west3 (Frankfurt)": "Europa-oeste 3 (Frankfurt)",
|
||||
"europe-west4 (Netherlands)": "Oeste4 (Holanda)",
|
||||
"europe-west6 (Zurich)": "European west6 (Zurich)",
|
||||
"europe-west8 (Milan)": "Oeste8 da Europa (Milão)",
|
||||
"europe-west9 (Paris)": "Oeste9 da Europa (Paris)",
|
||||
"asia-east1 (Taiwan)": "Ásia-Leste1 (Taiwan)",
|
||||
"asia-east2 (Hong Kong)": "Aeste2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-northeast1 (Tóquio)",
|
||||
"asia-northeast2 (Osaka)": "asia-norteast2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-norteast3 (Seul)",
|
||||
"asia-south1 (Mumbai)": "asia-sul (Mumbai)",
|
||||
"asia-south2 (Delhi)": "Ásia-sul2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "Ásia-Sudeste1 (Singapura)",
|
||||
"asia-southeast2 (Jakarta)": "asia-sudeste2 (Jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australia-sudeste1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australia-sudeste2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "Norte-americana-nordeste1 (Montreal)",
|
||||
"northamerica-northeast2 (Toronto)": "Norte-americano-nordeste2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "sul-americana-leste 1 (Sa├o Paulo)",
|
||||
"southamerica-west1 (Santiago)": "sudoamericana-oeste1 (Santiago)",
|
||||
"Standard": "Padrão",
|
||||
"Nearline": "Próximos",
|
||||
"Coldline": "Frio",
|
||||
"Archive": "Arquivo",
|
||||
"Multi-regional": "Multi-regional",
|
||||
"Regional": "Região",
|
||||
"Durable Reduced Availability": "Redução de durabilidade",
|
||||
"No ACLs (faster)": "Sem ACLs (mais rápido)",
|
||||
"Full (includes ACLs)": "Completo (incluindo ACLs)",
|
||||
"Reader": "Leitor",
|
||||
"Owner": "Proprietário",
|
||||
"Writer": "Escritor",
|
||||
"New Object Created": "Novo Objeto Criado",
|
||||
"Object Updated": "Objeto atualizado",
|
||||
"Triggers when a new object is created in a bucket": "Aciona quando um novo objeto é criado em um balde",
|
||||
"Triggers when an existing object is updated in a bucket": "Dispara quando um objeto existente é atualizado em um balde",
|
||||
"Prefix Filter": "Filtro de Prefixo",
|
||||
"Only trigger for objects with this prefix": "Apenas gatilho para objetos com este prefixo"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.",
|
||||
"Create Bucket": "Create Bucket",
|
||||
"Delete Empty Bucket": "Delete Empty Bucket",
|
||||
"Clone Object": "Clone Object",
|
||||
"Delete Object": "Delete Object",
|
||||
"Search Objects": "Search Objects",
|
||||
"Search Buckets": "Search Buckets",
|
||||
"Create Object ACL": "Create Object ACL",
|
||||
"Delete Object ACL": "Delete Object ACL",
|
||||
"Create Bucket ACL": "Create Bucket ACL",
|
||||
"Delete Bucket ACL": "Delete Bucket ACL",
|
||||
"Create Bucket Default Object ACL": "Create Bucket Default Object ACL",
|
||||
"Delete Bucket Default Object ACL": "Delete Bucket Default Object ACL",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Clean up unused buckets by deleting them if they contain no live objects.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Permanently delete a specific object. Perfect for removing obsolete files.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Search objects by criteria. Perfect for finding files in your bucket.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Search buckets by name. Perfect for finding buckets in your project.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Remove an ACL entry from an object. Perfect for revoking access for a user.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Remove default ACL settings from a bucket. Perfect for reverting to default behavior.",
|
||||
"Project": "Project",
|
||||
"Bucket Name": "Bucket Name",
|
||||
"Location": "Location",
|
||||
"Storage Class": "Storage Class",
|
||||
"Enable Versioning": "Enable Versioning",
|
||||
"Uniform Bucket Level Access": "Uniform Bucket Level Access",
|
||||
"Labels": "Labels",
|
||||
"Bucket": "Bucket",
|
||||
"Object": "Object",
|
||||
"Destination Object Name": "Destination Object Name",
|
||||
"Metadata Overrides": "Metadata Overrides",
|
||||
"Generation": "Generation",
|
||||
"Prefix": "Prefix",
|
||||
"Glob Pattern": "Glob Pattern",
|
||||
"Delimiter": "Delimiter",
|
||||
"Include Folders": "Include Folders",
|
||||
"Include Versions": "Include Versions",
|
||||
"Page Token": "Page Token",
|
||||
"Max Results": "Max Results",
|
||||
"Name Prefix": "Name Prefix",
|
||||
"Include Soft-Deleted": "Include Soft-Deleted",
|
||||
"Projection": "Projection",
|
||||
"Entity": "Entity",
|
||||
"Role": "Role",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Unique name for your bucket (must be globally unique, 3-63 characters)",
|
||||
"Key-value pairs for bucket labels": "Key-value pairs for bucket labels",
|
||||
"Name for the copied object (must be valid object name)": "Name for the copied object (must be valid object name)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Optional generation number for versioned objects (permanently deletes a specific revision)",
|
||||
"Filter objects whose names begin with this prefix": "Filter objects whose names begin with this prefix",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Delimiter for hierarchical listing (commonly \"/\")",
|
||||
"Include empty folders and managed folders in results": "Include empty folders and managed folders in results",
|
||||
"List all versions of objects as distinct results": "List all versions of objects as distinct results",
|
||||
"Token for pagination (from previous response)": "Token for pagination (from previous response)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Maximum number of objects to return (recommended: ≤1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Filter buckets whose names begin with this prefix",
|
||||
"Include soft-deleted bucket versions in results": "Include soft-deleted bucket versions in results",
|
||||
"Set of properties to return": "Set of properties to return",
|
||||
"Maximum number of buckets to return": "Maximum number of buckets to return",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Optional generation number for versioned objects",
|
||||
"US (Multi-region)": "US (Multi-region)",
|
||||
"EU (Multi-region)": "EU (Multi-region)",
|
||||
"ASIA (Multi-region)": "ASIA (Multi-region)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (South Carolina)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Northern Virginia)",
|
||||
"us-west1 (Oregon)": "us-west1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (Salt Lake City)",
|
||||
"us-west4 (Las Vegas)": "us-west4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "us-south1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "europe-central2 (Warsaw)",
|
||||
"europe-north1 (Finland)": "europe-north1 (Finland)",
|
||||
"europe-southwest1 (Madrid)": "europe-southwest1 (Madrid)",
|
||||
"europe-west1 (Belgium)": "europe-west1 (Belgium)",
|
||||
"europe-west2 (London)": "europe-west2 (London)",
|
||||
"europe-west3 (Frankfurt)": "europe-west3 (Frankfurt)",
|
||||
"europe-west4 (Netherlands)": "europe-west4 (Netherlands)",
|
||||
"europe-west6 (Zurich)": "europe-west6 (Zurich)",
|
||||
"europe-west8 (Milan)": "europe-west8 (Milan)",
|
||||
"europe-west9 (Paris)": "europe-west9 (Paris)",
|
||||
"asia-east1 (Taiwan)": "asia-east1 (Taiwan)",
|
||||
"asia-east2 (Hong Kong)": "asia-east2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-northeast1 (Tokyo)",
|
||||
"asia-northeast2 (Osaka)": "asia-northeast2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-northeast3 (Seoul)",
|
||||
"asia-south1 (Mumbai)": "asia-south1 (Mumbai)",
|
||||
"asia-south2 (Delhi)": "asia-south2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "asia-southeast1 (Singapore)",
|
||||
"asia-southeast2 (Jakarta)": "asia-southeast2 (Jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australia-southeast1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australia-southeast2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "northamerica-northeast1 (Montreal)",
|
||||
"northamerica-northeast2 (Toronto)": "northamerica-northeast2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "southamerica-east1 (São Paulo)",
|
||||
"southamerica-west1 (Santiago)": "southamerica-west1 (Santiago)",
|
||||
"Standard": "Standard",
|
||||
"Nearline": "Nearline",
|
||||
"Coldline": "Coldline",
|
||||
"Archive": "Archive",
|
||||
"Multi-regional": "Multi-regional",
|
||||
"Regional": "Regional",
|
||||
"Durable Reduced Availability": "Durable Reduced Availability",
|
||||
"No ACLs (faster)": "No ACLs (faster)",
|
||||
"Full (includes ACLs)": "Full (includes ACLs)",
|
||||
"Reader": "Reader",
|
||||
"Owner": "Owner",
|
||||
"Writer": "Writer",
|
||||
"New Object Created": "New Object Created",
|
||||
"Object Updated": "Object Updated",
|
||||
"Triggers when a new object is created in a bucket": "Triggers when a new object is created in a bucket",
|
||||
"Triggers when an existing object is updated in a bucket": "Triggers when an existing object is updated in a bucket",
|
||||
"Prefix Filter": "Prefix Filter",
|
||||
"Only trigger for objects with this prefix": "Only trigger for objects with this prefix"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.": "Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.",
|
||||
"Create Bucket": "Create Bucket",
|
||||
"Delete Empty Bucket": "Delete Empty Bucket",
|
||||
"Clone Object": "Clone Object",
|
||||
"Delete Object": "Delete Object",
|
||||
"Search Objects": "Search Objects",
|
||||
"Search Buckets": "Search Buckets",
|
||||
"Create Object ACL": "Create Object ACL",
|
||||
"Delete Object ACL": "Delete Object ACL",
|
||||
"Create Bucket ACL": "Create Bucket ACL",
|
||||
"Delete Bucket ACL": "Delete Bucket ACL",
|
||||
"Create Bucket Default Object ACL": "Create Bucket Default Object ACL",
|
||||
"Delete Bucket Default Object ACL": "Delete Bucket Default Object ACL",
|
||||
"Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.": "Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.",
|
||||
"Clean up unused buckets by deleting them if they contain no live objects.": "Clean up unused buckets by deleting them if they contain no live objects.",
|
||||
"Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.": "Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.",
|
||||
"Permanently delete a specific object. Perfect for removing obsolete files.": "Permanently delete a specific object. Perfect for removing obsolete files.",
|
||||
"Search objects by criteria. Perfect for finding files in your bucket.": "Search objects by criteria. Perfect for finding files in your bucket.",
|
||||
"Search buckets by name. Perfect for finding buckets in your project.": "Search buckets by name. Perfect for finding buckets in your project.",
|
||||
"Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.": "Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.",
|
||||
"Remove an ACL entry from an object. Perfect for revoking access for a user.": "Remove an ACL entry from an object. Perfect for revoking access for a user.",
|
||||
"Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.": "Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.",
|
||||
"Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.": "Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.",
|
||||
"Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.": "Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.",
|
||||
"Remove default ACL settings from a bucket. Perfect for reverting to default behavior.": "Remove default ACL settings from a bucket. Perfect for reverting to default behavior.",
|
||||
"Project": "项目",
|
||||
"Bucket Name": "Bucket Name",
|
||||
"Location": "Location",
|
||||
"Storage Class": "Storage Class",
|
||||
"Enable Versioning": "Enable Versioning",
|
||||
"Uniform Bucket Level Access": "Uniform Bucket Level Access",
|
||||
"Labels": "Labels",
|
||||
"Bucket": "Bucket",
|
||||
"Object": "Object",
|
||||
"Destination Object Name": "Destination Object Name",
|
||||
"Metadata Overrides": "Metadata Overrides",
|
||||
"Generation": "Generation",
|
||||
"Prefix": "Prefix",
|
||||
"Glob Pattern": "Glob Pattern",
|
||||
"Delimiter": "Delimiter",
|
||||
"Include Folders": "Include Folders",
|
||||
"Include Versions": "Include Versions",
|
||||
"Page Token": "Page Token",
|
||||
"Max Results": "Max Results",
|
||||
"Name Prefix": "Name Prefix",
|
||||
"Include Soft-Deleted": "Include Soft-Deleted",
|
||||
"Projection": "Projection",
|
||||
"Entity": "Entity",
|
||||
"Role": "作用",
|
||||
"Unique name for your bucket (must be globally unique, 3-63 characters)": "Unique name for your bucket (must be globally unique, 3-63 characters)",
|
||||
"Key-value pairs for bucket labels": "Key-value pairs for bucket labels",
|
||||
"Name for the copied object (must be valid object name)": "Name for the copied object (must be valid object name)",
|
||||
"Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)": "Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)",
|
||||
"Optional generation number for versioned objects (permanently deletes a specific revision)": "Optional generation number for versioned objects (permanently deletes a specific revision)",
|
||||
"Filter objects whose names begin with this prefix": "Filter objects whose names begin with this prefix",
|
||||
"Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")": "Glob pattern to filter results (e.g., \"folder/*\", \"backup-*.txt\")",
|
||||
"Delimiter for hierarchical listing (commonly \"/\")": "Delimiter for hierarchical listing (commonly \"/\")",
|
||||
"Include empty folders and managed folders in results": "Include empty folders and managed folders in results",
|
||||
"List all versions of objects as distinct results": "List all versions of objects as distinct results",
|
||||
"Token for pagination (from previous response)": "Token for pagination (from previous response)",
|
||||
"Maximum number of objects to return (recommended: ≤1000)": "Maximum number of objects to return (recommended: ≤1000)",
|
||||
"Filter buckets whose names begin with this prefix": "Filter buckets whose names begin with this prefix",
|
||||
"Include soft-deleted bucket versions in results": "Include soft-deleted bucket versions in results",
|
||||
"Set of properties to return": "Set of properties to return",
|
||||
"Maximum number of buckets to return": "Maximum number of buckets to return",
|
||||
"The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers": "The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers",
|
||||
"Optional generation number for versioned objects": "Optional generation number for versioned objects",
|
||||
"US (Multi-region)": "US (Multi-region)",
|
||||
"EU (Multi-region)": "EU (Multi-region)",
|
||||
"ASIA (Multi-region)": "ASIA (Multi-region)",
|
||||
"us-central1 (Iowa)": "us-central1 (Iowa)",
|
||||
"us-east1 (South Carolina)": "us-east1 (South Carolina)",
|
||||
"us-east4 (Northern Virginia)": "us-east4 (Northern Virginia)",
|
||||
"us-west1 (Oregon)": "us-west1 (Oregon)",
|
||||
"us-west2 (Los Angeles)": "us-west2 (Los Angeles)",
|
||||
"us-west3 (Salt Lake City)": "us-west3 (Salt Lake City)",
|
||||
"us-west4 (Las Vegas)": "us-west4 (Las Vegas)",
|
||||
"us-south1 (Dallas)": "us-south1 (Dallas)",
|
||||
"europe-central2 (Warsaw)": "europe-central2 (Warsaw)",
|
||||
"europe-north1 (Finland)": "europe-north1 (Finland)",
|
||||
"europe-southwest1 (Madrid)": "europe-southwest1 (Madrid)",
|
||||
"europe-west1 (Belgium)": "europe-west1 (Belgium)",
|
||||
"europe-west2 (London)": "europe-west2 (London)",
|
||||
"europe-west3 (Frankfurt)": "europe-west3 (Frankfurt)",
|
||||
"europe-west4 (Netherlands)": "europe-west4 (Netherlands)",
|
||||
"europe-west6 (Zurich)": "europe-west6 (Zurich)",
|
||||
"europe-west8 (Milan)": "europe-west8 (Milan)",
|
||||
"europe-west9 (Paris)": "europe-west9 (Paris)",
|
||||
"asia-east1 (Taiwan)": "asia-east1 (Taiwan)",
|
||||
"asia-east2 (Hong Kong)": "asia-east2 (Hong Kong)",
|
||||
"asia-northeast1 (Tokyo)": "asia-northeast1 (Tokyo)",
|
||||
"asia-northeast2 (Osaka)": "asia-northeast2 (Osaka)",
|
||||
"asia-northeast3 (Seoul)": "asia-northeast3 (Seoul)",
|
||||
"asia-south1 (Mumbai)": "asia-south1 (Mumbai)",
|
||||
"asia-south2 (Delhi)": "asia-south2 (Delhi)",
|
||||
"asia-southeast1 (Singapore)": "asia-southeast1 (Singapore)",
|
||||
"asia-southeast2 (Jakarta)": "asia-southeast2 (Jakarta)",
|
||||
"australia-southeast1 (Sydney)": "australia-southeast1 (Sydney)",
|
||||
"australia-southeast2 (Melbourne)": "australia-southeast2 (Melbourne)",
|
||||
"northamerica-northeast1 (Montreal)": "northamerica-northeast1 (Montreal)",
|
||||
"northamerica-northeast2 (Toronto)": "northamerica-northeast2 (Toronto)",
|
||||
"southamerica-east1 (São Paulo)": "southamerica-east1 (São Paulo)",
|
||||
"southamerica-west1 (Santiago)": "southamerica-west1 (Santiago)",
|
||||
"Standard": "Standard",
|
||||
"Nearline": "Nearline",
|
||||
"Coldline": "Coldline",
|
||||
"Archive": "Archive",
|
||||
"Multi-regional": "Multi-regional",
|
||||
"Regional": "Regional",
|
||||
"Durable Reduced Availability": "Durable Reduced Availability",
|
||||
"No ACLs (faster)": "No ACLs (faster)",
|
||||
"Full (includes ACLs)": "Full (includes ACLs)",
|
||||
"Reader": "Reader",
|
||||
"Owner": "所有者",
|
||||
"Writer": "Writer",
|
||||
"New Object Created": "New Object Created",
|
||||
"Object Updated": "Object Updated",
|
||||
"Triggers when a new object is created in a bucket": "Triggers when a new object is created in a bucket",
|
||||
"Triggers when an existing object is updated in a bucket": "Triggers when an existing object is updated in a bucket",
|
||||
"Prefix Filter": "Prefix Filter",
|
||||
"Only trigger for objects with this prefix": "Only trigger for objects with this prefix"
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
|
||||
import { createPiece } from "@activepieces/pieces-framework";
|
||||
import { PieceCategory } from "@activepieces/shared";
|
||||
import { googleCloudStorageAuth } from "./lib/common/auth";
|
||||
import { createBucket } from "./lib/actions/create-bucket";
|
||||
import { deleteEmptyBucket } from "./lib/actions/delete-empty-bucket";
|
||||
import { cloneObject } from "./lib/actions/clone-object";
|
||||
import { deleteObject } from "./lib/actions/delete-object";
|
||||
import { searchObjects } from "./lib/actions/search-objects";
|
||||
import { searchBuckets } from "./lib/actions/search-buckets";
|
||||
import { createObjectAcl } from "./lib/actions/create-object-acl";
|
||||
import { deleteObjectAcl } from "./lib/actions/delete-object-acl";
|
||||
import { createBucketAcl } from "./lib/actions/create-bucket-acl";
|
||||
import { deleteBucketAcl } from "./lib/actions/delete-bucket-acl";
|
||||
import { createBucketDefaultObjectAcl } from "./lib/actions/create-bucket-default-object-acl";
|
||||
import { deleteBucketDefaultObjectAcl } from "./lib/actions/delete-bucket-default-object-acl";
|
||||
import { newObjectCreated } from "./lib/triggers/new-object-created";
|
||||
import { objectUpdated } from "./lib/triggers/object-updated";
|
||||
|
||||
export const googleCloudStorage = createPiece({
|
||||
displayName: "Google Cloud Storage",
|
||||
description: "Automate file storage operations with Google Cloud Storage. Upload, download, manage buckets, set permissions, and monitor changes with real-time triggers.",
|
||||
auth: googleCloudStorageAuth,
|
||||
minimumSupportedRelease: '0.36.1',
|
||||
logoUrl: "https://cdn.activepieces.com/pieces/google-cloud-storage.png",
|
||||
authors: ["sparkybug"],
|
||||
categories: [PieceCategory.CONTENT_AND_FILES],
|
||||
actions: [
|
||||
createBucket,
|
||||
deleteEmptyBucket,
|
||||
cloneObject,
|
||||
deleteObject,
|
||||
searchObjects,
|
||||
searchBuckets,
|
||||
createObjectAcl,
|
||||
deleteObjectAcl,
|
||||
createBucketAcl,
|
||||
deleteBucketAcl,
|
||||
createBucketDefaultObjectAcl,
|
||||
deleteBucketDefaultObjectAcl,
|
||||
],
|
||||
triggers: [
|
||||
newObjectCreated,
|
||||
objectUpdated,
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,73 @@
|
||||
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, objectDropdown, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const cloneObject = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'clone_object',
|
||||
displayName: 'Clone Object',
|
||||
description: 'Copy / clone an object (file) to a new location (same or different bucket), optionally overriding metadata. Perfect for duplicating files as backup or version.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
sourceBucket: bucketDropdown,
|
||||
sourceObject: objectDropdown('sourceBucket'),
|
||||
destBucket: bucketDropdown,
|
||||
destObject: Property.ShortText({
|
||||
displayName: 'Destination Object Name',
|
||||
description: 'Name for the copied object (must be valid object name)',
|
||||
required: true,
|
||||
}),
|
||||
metadataOverrides: Property.Object({
|
||||
displayName: 'Metadata Overrides',
|
||||
description: 'Optional metadata and properties to override in the copied object (contentType, cacheControl, contentDisposition, etc.)',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { sourceBucket, sourceObject, destBucket, destObject, metadataOverrides } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const body = metadataOverrides || undefined;
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.POST,
|
||||
`/b/${sourceBucket}/o/${encodeURIComponent(sourceObject as string)}/copyTo/b/${destBucket}/o/${encodeURIComponent(destObject as string)}`,
|
||||
auth.access_token,
|
||||
body
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
source: {
|
||||
bucket: sourceBucket,
|
||||
object: sourceObject,
|
||||
},
|
||||
destination: {
|
||||
bucket: destBucket,
|
||||
object: destObject,
|
||||
},
|
||||
object: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Source object "${sourceObject}" not found in bucket "${sourceBucket}".`);
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. Check permissions for source and destination buckets.');
|
||||
}
|
||||
if (error.response?.status === 412) {
|
||||
throw new Error('Precondition failed. Source object may have been modified.');
|
||||
}
|
||||
if (error.response?.status === 409) {
|
||||
throw new Error(`Destination object "${destObject}" already exists in bucket "${destBucket}".`);
|
||||
}
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Invalid request. Check object names and bucket configurations.');
|
||||
}
|
||||
throw new Error(`Failed to clone object: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,56 @@
|
||||
import { createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, aclEntityProperty, bucketAclRoleProperty, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const createBucketAcl = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'create_bucket_acl',
|
||||
displayName: 'Create Bucket ACL',
|
||||
description: 'Add an ACL entry at bucket level. Perfect for granting permission to manage the bucket.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
entity: aclEntityProperty,
|
||||
role: bucketAclRoleProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, entity, role } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const aclEntry = {
|
||||
entity,
|
||||
role,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.POST,
|
||||
`/b/${bucket}/acl`,
|
||||
auth.access_token,
|
||||
aclEntry
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
acl: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Bad request. This bucket may have uniform bucket-level access enabled, which doesn\'t support bucket ACLs. Use IAM policies instead.');
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.buckets.update permission to modify bucket ACLs.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Bucket "${bucket}" not found.`);
|
||||
}
|
||||
if (error.response?.status === 409) {
|
||||
throw new Error(`ACL entry for entity "${entity}" already exists on bucket "${bucket}".`);
|
||||
}
|
||||
throw new Error(`Failed to create bucket ACL: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,56 @@
|
||||
import { createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, aclEntityProperty, objectAclRoleProperty, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const createBucketDefaultObjectAcl = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'create_bucket_default_object_acl',
|
||||
displayName: 'Create Bucket Default Object ACL',
|
||||
description: 'Set default ACLs for new objects added to a bucket. Perfect for automatically assigning permissions to new uploads.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
entity: aclEntityProperty,
|
||||
role: objectAclRoleProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, entity, role } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const aclEntry = {
|
||||
entity,
|
||||
role,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.POST,
|
||||
`/b/${bucket}/defaultObjectAcl`,
|
||||
auth.access_token,
|
||||
aclEntry
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
acl: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Bad request. This bucket may have uniform bucket-level access enabled, which doesn\'t support default object ACLs. Use IAM policies instead.');
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.buckets.update permission to modify bucket default object ACLs.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Bucket "${bucket}" not found.`);
|
||||
}
|
||||
if (error.response?.status === 409) {
|
||||
throw new Error(`Default object ACL entry for entity "${entity}" already exists on bucket "${bucket}".`);
|
||||
}
|
||||
throw new Error(`Failed to create bucket default object ACL: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,73 @@
|
||||
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { projectIdProperty, bucketNameProperty, locationProperty, storageClassProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const createBucket = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'create_bucket',
|
||||
displayName: 'Create Bucket',
|
||||
description: 'Create a new bucket in a specified location/configuration. Perfect for automating storage provisioning for new projects.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
name: bucketNameProperty,
|
||||
location: locationProperty,
|
||||
storageClass: storageClassProperty,
|
||||
versioning: Property.Checkbox({
|
||||
displayName: 'Enable Versioning',
|
||||
required: false,
|
||||
}),
|
||||
uniformBucketLevelAccess: Property.Checkbox({
|
||||
displayName: 'Uniform Bucket Level Access',
|
||||
required: false,
|
||||
}),
|
||||
labels: Property.Object({
|
||||
displayName: 'Labels',
|
||||
description: 'Key-value pairs for bucket labels',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { projectId, name, location, storageClass, versioning, uniformBucketLevelAccess, labels } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const bucketConfig: any = {
|
||||
name,
|
||||
location: location || 'US',
|
||||
storageClass: storageClass || 'STANDARD',
|
||||
};
|
||||
|
||||
if (versioning) {
|
||||
bucketConfig.versioning = { enabled: true };
|
||||
}
|
||||
|
||||
if (uniformBucketLevelAccess !== undefined) {
|
||||
bucketConfig.iamConfiguration = {
|
||||
uniformBucketLevelAccess: {
|
||||
enabled: uniformBucketLevelAccess,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if (labels) {
|
||||
bucketConfig.labels = labels;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(HttpMethod.POST, `/b?project=${projectId}`, auth.access_token, bucketConfig);
|
||||
return response;
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 409) {
|
||||
throw new Error(`Bucket "${name}" already exists. Bucket names must be globally unique.`);
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. Check your permissions for the selected project.');
|
||||
}
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Invalid bucket configuration. Check bucket name format and project settings.');
|
||||
}
|
||||
throw new Error(`Failed to create bucket: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,79 @@
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import {
|
||||
bucketDropdown,
|
||||
objectDropdown,
|
||||
aclEntityProperty,
|
||||
objectAclRoleProperty,
|
||||
projectIdProperty,
|
||||
} from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const createObjectAcl = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'create_object_acl',
|
||||
displayName: 'Create Object ACL',
|
||||
description: 'Add an ACL entry to an object (grant a permission). Perfect for granting read/write access to a user or group.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
object: objectDropdown('bucket'),
|
||||
entity: aclEntityProperty,
|
||||
role: objectAclRoleProperty,
|
||||
generation: Property.Number({
|
||||
displayName: 'Generation',
|
||||
description: 'Optional generation number for versioned objects',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, object, entity, role, generation } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const aclEntry = {
|
||||
entity,
|
||||
role,
|
||||
};
|
||||
|
||||
let path = `/b/${bucket}/o/${encodeURIComponent(object as string)}/acl`;
|
||||
if (generation) {
|
||||
path += `?generation=${generation}`;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.POST,
|
||||
path,
|
||||
auth.access_token,
|
||||
aclEntry
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
object,
|
||||
generation: generation || 'latest',
|
||||
acl: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Bad request. This bucket may have uniform bucket-level access enabled, which doesn\'t support object ACLs. Use IAM policies instead.');
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.objects.setIamPolicy permission or OWNER ACL permission on the object.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Object "${object}" not found in bucket "${bucket}".`);
|
||||
}
|
||||
if (error.response?.status === 409) {
|
||||
throw new Error(`ACL entry for entity "${entity}" already exists on this object.`);
|
||||
}
|
||||
throw new Error(`Failed to create object ACL: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,50 @@
|
||||
import { createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, aclEntityProperty, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const deleteBucketAcl = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'delete_bucket_acl',
|
||||
displayName: 'Delete Bucket ACL',
|
||||
description: 'Remove an ACL entry from a bucket. Perfect for revoking access for a user or group.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
entity: aclEntityProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, entity } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
try {
|
||||
await gcsCommon.makeRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/b/${bucket}/acl/${encodeURIComponent(entity)}`,
|
||||
auth.access_token
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
entity,
|
||||
message: `ACL entry for entity "${entity}" removed successfully from bucket "${bucket}"`,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Bad request. This bucket may have uniform bucket-level access enabled, which doesn\'t support bucket ACLs. Use IAM policies instead.');
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.buckets.update permission to modify bucket ACLs.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
if (error.response?.data?.error?.message?.includes('ACL')) {
|
||||
throw new Error(`ACL entry for entity "${entity}" not found on bucket "${bucket}".`);
|
||||
}
|
||||
throw new Error(`Bucket "${bucket}" not found.`);
|
||||
}
|
||||
throw new Error(`Failed to delete bucket ACL: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,50 @@
|
||||
import { createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, aclEntityProperty, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const deleteBucketDefaultObjectAcl = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'delete_bucket_default_object_acl',
|
||||
displayName: 'Delete Bucket Default Object ACL',
|
||||
description: 'Remove default ACL settings from a bucket. Perfect for reverting to default behavior.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
entity: aclEntityProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, entity } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
try {
|
||||
await gcsCommon.makeRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/b/${bucket}/defaultObjectAcl/${encodeURIComponent(entity)}`,
|
||||
auth.access_token
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
entity,
|
||||
message: `Default object ACL entry for entity "${entity}" removed successfully from bucket "${bucket}"`,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Bad request. This bucket may have uniform bucket-level access enabled, which doesn\'t support default object ACLs. Use IAM policies instead.');
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.buckets.update permission to modify bucket default object ACLs.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
if (error.response?.data?.error?.message?.includes('ACL')) {
|
||||
throw new Error(`Default object ACL entry for entity "${entity}" not found on bucket "${bucket}".`);
|
||||
}
|
||||
throw new Error(`Bucket "${bucket}" not found.`);
|
||||
}
|
||||
throw new Error(`Failed to delete bucket default object ACL: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,40 @@
|
||||
import { createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const deleteEmptyBucket = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'delete_empty_bucket',
|
||||
displayName: 'Delete Empty Bucket',
|
||||
description: 'Clean up unused buckets by deleting them if they contain no live objects.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
try {
|
||||
await gcsCommon.makeRequest(HttpMethod.DELETE, `/b/${bucket}`, auth.access_token);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Bucket "${bucket}" deleted successfully`,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 409) {
|
||||
throw new Error(`Bucket "${bucket}" contains live or noncurrent objects and cannot be deleted. Remove all objects first.`);
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.buckets.delete permission to delete this bucket.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Bucket "${bucket}" not found. It may have already been deleted.`);
|
||||
}
|
||||
throw new Error(`Failed to delete bucket: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,62 @@
|
||||
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, objectDropdown, aclEntityProperty, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const deleteObjectAcl = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'delete_object_acl',
|
||||
displayName: 'Delete Object ACL',
|
||||
description: 'Remove an ACL entry from an object. Perfect for revoking access for a user.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
object: objectDropdown('bucket'),
|
||||
entity: aclEntityProperty,
|
||||
generation: Property.Number({
|
||||
displayName: 'Generation',
|
||||
description: 'Optional generation number for versioned objects',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, object, entity, generation } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
let path = `/b/${bucket}/o/${encodeURIComponent(object as string)}/acl/${encodeURIComponent(entity as string)}`;
|
||||
if (generation) {
|
||||
path += `?generation=${generation}`;
|
||||
}
|
||||
|
||||
try {
|
||||
await gcsCommon.makeRequest(HttpMethod.DELETE, path, auth.access_token);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
object,
|
||||
entity,
|
||||
generation: generation || 'latest',
|
||||
message: `ACL entry for entity "${entity}" removed successfully from object "${object}"`,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 400) {
|
||||
if (entity.includes('user-') && entity.includes('@')) {
|
||||
throw new Error('Cannot remove OWNER access from the object owner. The only way to remove owner access is to delete or replace the object.');
|
||||
}
|
||||
throw new Error('Bad request. This bucket may have uniform bucket-level access enabled, which doesn\'t support object ACLs. Use IAM policies instead.');
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.objects.setIamPolicy permission or OWNER ACL permission on the object.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
if (error.response?.data?.error?.message?.includes('ACL')) {
|
||||
throw new Error(`ACL entry for entity "${entity}" not found on object "${object}".`);
|
||||
}
|
||||
throw new Error(`Object "${object}" not found in bucket "${bucket}".`);
|
||||
}
|
||||
throw new Error(`Failed to delete object ACL: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,57 @@
|
||||
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, objectDropdown, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const deleteObject = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'delete_object',
|
||||
displayName: 'Delete Object',
|
||||
description: 'Permanently delete a specific object. Perfect for removing obsolete files.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
object: objectDropdown('bucket'),
|
||||
generation: Property.Number({
|
||||
displayName: 'Generation',
|
||||
description: 'Optional generation number for versioned objects (permanently deletes a specific revision)',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { bucket, object, generation } = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
let path = `/b/${bucket}/o/${encodeURIComponent(object as string)}`;
|
||||
if (generation) {
|
||||
path += `?generation=${generation}`;
|
||||
}
|
||||
|
||||
try {
|
||||
await gcsCommon.makeRequest(HttpMethod.DELETE, path, auth.access_token);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
object,
|
||||
generation: generation || 'latest',
|
||||
message: `Object "${object}" deleted successfully from bucket "${bucket}"`,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Object "${object}" not found in bucket "${bucket}". It may have already been deleted.`);
|
||||
}
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.objects.delete permission to delete this object.');
|
||||
}
|
||||
if (error.response?.status === 412) {
|
||||
throw new Error('Precondition failed. Object may have been modified or deleted by another process.');
|
||||
}
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Invalid request. Check object name and generation parameters.');
|
||||
}
|
||||
throw new Error(`Failed to delete object: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,90 @@
|
||||
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const searchBuckets = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'search_buckets',
|
||||
displayName: 'Search Buckets',
|
||||
description: 'Search buckets by name. Perfect for finding buckets in your project.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
prefix: Property.ShortText({
|
||||
displayName: 'Name Prefix',
|
||||
description: 'Filter buckets whose names begin with this prefix',
|
||||
required: false,
|
||||
}),
|
||||
includeSoftDeleted: Property.Checkbox({
|
||||
displayName: 'Include Soft-Deleted',
|
||||
description: 'Include soft-deleted bucket versions in results',
|
||||
required: false,
|
||||
}),
|
||||
projection: Property.StaticDropdown({
|
||||
displayName: 'Projection',
|
||||
description: 'Set of properties to return',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'No ACLs (faster)', value: 'noAcl' },
|
||||
{ label: 'Full (includes ACLs)', value: 'full' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
pageToken: Property.ShortText({
|
||||
displayName: 'Page Token',
|
||||
description: 'Token for pagination (from previous response)',
|
||||
required: false,
|
||||
}),
|
||||
maxResults: Property.Number({
|
||||
displayName: 'Max Results',
|
||||
description: 'Maximum number of buckets to return',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
projectId,
|
||||
prefix,
|
||||
includeSoftDeleted,
|
||||
projection,
|
||||
pageToken,
|
||||
maxResults
|
||||
} = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const params = new URLSearchParams();
|
||||
params.append('project', projectId!);
|
||||
if (prefix) params.append('prefix', prefix);
|
||||
if (includeSoftDeleted) params.append('softDeleted', 'true');
|
||||
if (projection) params.append('projection', projection);
|
||||
if (pageToken) params.append('pageToken', pageToken);
|
||||
if (maxResults) params.append('maxResults', maxResults.toString());
|
||||
|
||||
const path = `/b?${params.toString()}`;
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(HttpMethod.GET, path, auth.access_token);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
projectId,
|
||||
items: response.items || [],
|
||||
nextPageToken: response.nextPageToken,
|
||||
totalBuckets: response.items?.length || 0,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.buckets.list permission to search buckets in this project.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Project "${projectId}" not found or you don't have access to it.`);
|
||||
}
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Invalid search parameters. Check your project ID and other filters.');
|
||||
}
|
||||
throw new Error(`Failed to search buckets: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,99 @@
|
||||
import { createAction, Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
export const searchObjects = createAction({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'search_objects',
|
||||
displayName: 'Search Objects',
|
||||
description: 'Search objects by criteria. Perfect for finding files in your bucket.',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
prefix: Property.ShortText({
|
||||
displayName: 'Prefix',
|
||||
description: 'Filter objects whose names begin with this prefix',
|
||||
required: false,
|
||||
}),
|
||||
matchGlob: Property.ShortText({
|
||||
displayName: 'Glob Pattern',
|
||||
description: 'Glob pattern to filter results (e.g., "folder/*", "backup-*.txt")',
|
||||
required: false,
|
||||
}),
|
||||
delimiter: Property.ShortText({
|
||||
displayName: 'Delimiter',
|
||||
description: 'Delimiter for hierarchical listing (commonly "/")',
|
||||
required: false,
|
||||
}),
|
||||
includeFoldersAsPrefixes: Property.Checkbox({
|
||||
displayName: 'Include Folders',
|
||||
description: 'Include empty folders and managed folders in results',
|
||||
required: false,
|
||||
}),
|
||||
versions: Property.Checkbox({
|
||||
displayName: 'Include Versions',
|
||||
description: 'List all versions of objects as distinct results',
|
||||
required: false,
|
||||
}),
|
||||
pageToken: Property.ShortText({
|
||||
displayName: 'Page Token',
|
||||
description: 'Token for pagination (from previous response)',
|
||||
required: false,
|
||||
}),
|
||||
maxResults: Property.Number({
|
||||
displayName: 'Max Results',
|
||||
description: 'Maximum number of objects to return (recommended: ≤1000)',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
bucket,
|
||||
prefix,
|
||||
matchGlob,
|
||||
delimiter,
|
||||
includeFoldersAsPrefixes,
|
||||
versions,
|
||||
pageToken,
|
||||
maxResults
|
||||
} = context.propsValue;
|
||||
const auth = context.auth as OAuth2PropertyValue;
|
||||
|
||||
const params = new URLSearchParams();
|
||||
if (prefix) params.append('prefix', prefix);
|
||||
if (matchGlob) params.append('matchGlob', matchGlob);
|
||||
if (delimiter) params.append('delimiter', delimiter);
|
||||
if (includeFoldersAsPrefixes) params.append('includeFoldersAsPrefixes', 'true');
|
||||
if (versions) params.append('versions', 'true');
|
||||
if (pageToken) params.append('pageToken', pageToken);
|
||||
if (maxResults) params.append('maxResults', maxResults.toString());
|
||||
|
||||
const path = `/b/${bucket}/o?${params.toString()}`;
|
||||
|
||||
try {
|
||||
const response = await gcsCommon.makeRequest(HttpMethod.GET, path, auth.access_token);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
bucket,
|
||||
items: response.items || [],
|
||||
nextPageToken: response.nextPageToken,
|
||||
prefixes: response.prefixes || [],
|
||||
totalItems: response.items?.length || 0,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error('Access denied. You need storage.objects.list permission to search objects in this bucket.');
|
||||
}
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(`Bucket "${bucket}" not found.`);
|
||||
}
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error('Invalid search parameters. Check your prefix, glob pattern, or other filters.');
|
||||
}
|
||||
throw new Error(`Failed to search objects: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
import { PieceAuth } from '@activepieces/pieces-framework';
|
||||
|
||||
export const googleCloudStorageAuth = PieceAuth.OAuth2({
|
||||
description: '',
|
||||
authUrl: 'https://accounts.google.com/o/oauth2/auth',
|
||||
tokenUrl: 'https://oauth2.googleapis.com/token',
|
||||
required: true,
|
||||
scope: [
|
||||
'https://www.googleapis.com/auth/devstorage.read_write',
|
||||
'https://www.googleapis.com/auth/devstorage.full_control',
|
||||
'https://www.googleapis.com/auth/cloud-platform.read-only',
|
||||
'https://www.googleapis.com/auth/pubsub'
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,63 @@
|
||||
import {
|
||||
httpClient,
|
||||
HttpMethod,
|
||||
AuthenticationType,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
|
||||
export const gcsCommon = {
|
||||
gcsBaseUrl: 'https://www.googleapis.com/storage/v1',
|
||||
pubsubBaseUrl: 'https://pubsub.googleapis.com/v1',
|
||||
|
||||
async makeGCSRequest(
|
||||
method: HttpMethod,
|
||||
path: string,
|
||||
accessToken: string,
|
||||
body?: any
|
||||
): Promise<any> {
|
||||
const url = path.startsWith('http') ? path : `${this.gcsBaseUrl}${path}`;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method,
|
||||
url,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: accessToken,
|
||||
},
|
||||
body,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
|
||||
async makePubSubRequest(
|
||||
method: HttpMethod,
|
||||
path: string,
|
||||
accessToken: string,
|
||||
body?: any
|
||||
): Promise<any> {
|
||||
const url = path.startsWith('http') ? path : `${this.pubsubBaseUrl}${path}`;
|
||||
|
||||
const response = await httpClient.sendRequest({
|
||||
method,
|
||||
url,
|
||||
authentication: {
|
||||
type: AuthenticationType.BEARER_TOKEN,
|
||||
token: accessToken,
|
||||
},
|
||||
body,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
|
||||
// For backward compatibility
|
||||
async makeRequest(
|
||||
method: HttpMethod,
|
||||
path: string,
|
||||
accessToken: string,
|
||||
body?: any
|
||||
): Promise<any> {
|
||||
return this.makeGCSRequest(method, path, accessToken, body);
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,249 @@
|
||||
import { Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
import { gcsCommon } from './client';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { googleCloudStorageAuth } from './auth';
|
||||
|
||||
export const bucketDropdown = Property.Dropdown<string,true,typeof googleCloudStorageAuth>({
|
||||
displayName: 'Bucket',
|
||||
required: true,
|
||||
refreshers: ['projectId'],
|
||||
auth: googleCloudStorageAuth,
|
||||
options: async ({ auth, projectId }) => {
|
||||
if (!auth || !projectId) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: projectId
|
||||
? 'Please connect your account first'
|
||||
: 'Please enter project ID first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authValue = auth as OAuth2PropertyValue;
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.GET,
|
||||
`/b?project=${projectId}`,
|
||||
authValue.access_token
|
||||
);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options:
|
||||
response.items?.map((bucket: any) => ({
|
||||
label: bucket.name,
|
||||
value: bucket.name,
|
||||
})) || [],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load buckets',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const objectDropdown = (bucketProperty: string) =>
|
||||
Property.Dropdown<string,true,typeof googleCloudStorageAuth>({
|
||||
displayName: 'Object',
|
||||
required: true,
|
||||
auth: googleCloudStorageAuth,
|
||||
refreshers: [bucketProperty],
|
||||
options: async ({ auth, [bucketProperty]: bucket }) => {
|
||||
if (!auth || !bucket) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: bucket
|
||||
? 'Please connect your account first'
|
||||
: 'Please select a bucket first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authValue = auth as OAuth2PropertyValue;
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.GET,
|
||||
`/b/${bucket}/o?maxResults=100`,
|
||||
authValue.access_token
|
||||
);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options:
|
||||
response.items?.map((object: any) => ({
|
||||
label: object.name,
|
||||
value: object.name,
|
||||
})) || [],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load objects',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const projectIdProperty = Property.Dropdown<string,true,typeof googleCloudStorageAuth>({
|
||||
displayName: 'Project',
|
||||
required: true,
|
||||
auth: googleCloudStorageAuth,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authValue = auth as OAuth2PropertyValue;
|
||||
// Use Google Cloud Resource Manager API to list projects
|
||||
const response = await gcsCommon.makeRequest(
|
||||
HttpMethod.GET,
|
||||
'https://cloudresourcemanager.googleapis.com/v1/projects?filter=lifecycleState:ACTIVE',
|
||||
authValue.access_token
|
||||
);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: response.projects?.map((project: any) => ({
|
||||
label: `${project.displayName || project.name} (${project.projectId})`,
|
||||
value: project.projectId,
|
||||
})) || [],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load projects. Check your permissions.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const bucketNameProperty = Property.ShortText({
|
||||
displayName: 'Bucket Name',
|
||||
description: 'Unique name for your bucket (must be globally unique, 3-63 characters)',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const objectNameProperty = Property.ShortText({
|
||||
displayName: 'Object Name',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const locationProperty = Property.StaticDropdown({
|
||||
displayName: 'Location',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
// Multi-region
|
||||
{ label: 'US (Multi-region)', value: 'US' },
|
||||
{ label: 'EU (Multi-region)', value: 'EU' },
|
||||
{ label: 'ASIA (Multi-region)', value: 'ASIA' },
|
||||
// US regions
|
||||
{ label: 'us-central1 (Iowa)', value: 'us-central1' },
|
||||
{ label: 'us-east1 (South Carolina)', value: 'us-east1' },
|
||||
{ label: 'us-east4 (Northern Virginia)', value: 'us-east4' },
|
||||
{ label: 'us-west1 (Oregon)', value: 'us-west1' },
|
||||
{ label: 'us-west2 (Los Angeles)', value: 'us-west2' },
|
||||
{ label: 'us-west3 (Salt Lake City)', value: 'us-west3' },
|
||||
{ label: 'us-west4 (Las Vegas)', value: 'us-west4' },
|
||||
{ label: 'us-south1 (Dallas)', value: 'us-south1' },
|
||||
// Europe regions
|
||||
{ label: 'europe-central2 (Warsaw)', value: 'europe-central2' },
|
||||
{ label: 'europe-north1 (Finland)', value: 'europe-north1' },
|
||||
{ label: 'europe-southwest1 (Madrid)', value: 'europe-southwest1' },
|
||||
{ label: 'europe-west1 (Belgium)', value: 'europe-west1' },
|
||||
{ label: 'europe-west2 (London)', value: 'europe-west2' },
|
||||
{ label: 'europe-west3 (Frankfurt)', value: 'europe-west3' },
|
||||
{ label: 'europe-west4 (Netherlands)', value: 'europe-west4' },
|
||||
{ label: 'europe-west6 (Zurich)', value: 'europe-west6' },
|
||||
{ label: 'europe-west8 (Milan)', value: 'europe-west8' },
|
||||
{ label: 'europe-west9 (Paris)', value: 'europe-west9' },
|
||||
// Asia regions
|
||||
{ label: 'asia-east1 (Taiwan)', value: 'asia-east1' },
|
||||
{ label: 'asia-east2 (Hong Kong)', value: 'asia-east2' },
|
||||
{ label: 'asia-northeast1 (Tokyo)', value: 'asia-northeast1' },
|
||||
{ label: 'asia-northeast2 (Osaka)', value: 'asia-northeast2' },
|
||||
{ label: 'asia-northeast3 (Seoul)', value: 'asia-northeast3' },
|
||||
{ label: 'asia-south1 (Mumbai)', value: 'asia-south1' },
|
||||
{ label: 'asia-south2 (Delhi)', value: 'asia-south2' },
|
||||
{ label: 'asia-southeast1 (Singapore)', value: 'asia-southeast1' },
|
||||
{ label: 'asia-southeast2 (Jakarta)', value: 'asia-southeast2' },
|
||||
// Other regions
|
||||
{ label: 'australia-southeast1 (Sydney)', value: 'australia-southeast1' },
|
||||
{ label: 'australia-southeast2 (Melbourne)', value: 'australia-southeast2' },
|
||||
{ label: 'northamerica-northeast1 (Montreal)', value: 'northamerica-northeast1' },
|
||||
{ label: 'northamerica-northeast2 (Toronto)', value: 'northamerica-northeast2' },
|
||||
{ label: 'southamerica-east1 (São Paulo)', value: 'southamerica-east1' },
|
||||
{ label: 'southamerica-west1 (Santiago)', value: 'southamerica-west1' },
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
export const storageClassProperty = Property.StaticDropdown({
|
||||
displayName: 'Storage Class',
|
||||
required: false,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Standard', value: 'STANDARD' },
|
||||
{ label: 'Nearline', value: 'NEARLINE' },
|
||||
{ label: 'Coldline', value: 'COLDLINE' },
|
||||
{ label: 'Archive', value: 'ARCHIVE' },
|
||||
{ label: 'Multi-regional', value: 'MULTI_REGIONAL' },
|
||||
{ label: 'Regional', value: 'REGIONAL' },
|
||||
{ label: 'Durable Reduced Availability', value: 'DURABLE_REDUCED_AVAILABILITY' },
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
export const aclEntityProperty = Property.ShortText({
|
||||
displayName: 'Entity',
|
||||
description: 'The entity to grant access to. Must include the entity type prefix. Format: user-emailAddress, group-groupId, group-emailAddress, domain-domainName, project-team-projectId, allUsers, or allAuthenticatedUsers. Examples: user-liz@example.com, group-mygroup@googlegroups.com, domain-example.com, allUsers',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const aclRoleProperty = Property.StaticDropdown({
|
||||
displayName: 'Role',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Reader', value: 'READER' },
|
||||
{ label: 'Writer', value: 'WRITER' },
|
||||
{ label: 'Owner', value: 'OWNER' },
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
// For bucket ACLs - supports OWNER, WRITER, READER
|
||||
export const bucketAclRoleProperty = Property.StaticDropdown({
|
||||
displayName: 'Role',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Reader', value: 'READER' },
|
||||
{ label: 'Writer', value: 'WRITER' },
|
||||
{ label: 'Owner', value: 'OWNER' },
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
// For object ACLs - supports OWNER, READER only
|
||||
export const objectAclRoleProperty = Property.StaticDropdown({
|
||||
displayName: 'Role',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Reader', value: 'READER' },
|
||||
{ label: 'Owner', value: 'OWNER' },
|
||||
],
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,171 @@
|
||||
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
interface TriggerData {
|
||||
topicName: string;
|
||||
subscriptionName: string;
|
||||
notificationId: string;
|
||||
}
|
||||
|
||||
export const newObjectCreated = createTrigger({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'new_object_created',
|
||||
displayName: 'New Object Created',
|
||||
description: 'Triggers when a new object is created in a bucket',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
prefix: Property.ShortText({
|
||||
displayName: 'Prefix Filter',
|
||||
description: 'Only trigger for objects with this prefix',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
kind: 'storage#object',
|
||||
id: 'example-bucket/example-object/1234567890',
|
||||
name: 'example-object.txt',
|
||||
bucket: 'example-bucket',
|
||||
generation: '1234567890',
|
||||
contentType: 'text/plain',
|
||||
timeCreated: '2023-01-01T00:00:00.000Z',
|
||||
updated: '2023-01-01T00:00:00.000Z',
|
||||
size: '1024',
|
||||
},
|
||||
onEnable: async (context) => {
|
||||
const { projectId, bucket, prefix } = context.propsValue;
|
||||
const auth = context.auth;
|
||||
|
||||
// Generate unique names for this trigger instance
|
||||
const triggerId = `ap-gcs-${bucket}-${Date.now()}`;
|
||||
const topicName = `projects/${projectId}/topics/${triggerId}`;
|
||||
const subscriptionName = `projects/${projectId}/subscriptions/${triggerId}`;
|
||||
|
||||
try {
|
||||
// 1. Create Pub/Sub topic
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.PUT,
|
||||
`/projects/${projectId}/topics/${triggerId}`,
|
||||
auth.access_token
|
||||
);
|
||||
|
||||
// 2. Create GCS notification configuration
|
||||
const notificationConfig: any = {
|
||||
topic: topicName,
|
||||
payload_format: 'JSON_API_V1',
|
||||
event_types: ['OBJECT_FINALIZE'],
|
||||
};
|
||||
|
||||
if (prefix) {
|
||||
notificationConfig.object_name_prefix = prefix;
|
||||
}
|
||||
|
||||
const notificationResponse = await gcsCommon.makeGCSRequest(
|
||||
HttpMethod.POST,
|
||||
`/b/${bucket}/notificationConfigs`,
|
||||
auth.access_token,
|
||||
notificationConfig
|
||||
);
|
||||
|
||||
// 3. Create Pub/Sub subscription with webhook push
|
||||
const subscriptionConfig = {
|
||||
topic: topicName,
|
||||
pushConfig: {
|
||||
pushEndpoint: context.webhookUrl,
|
||||
},
|
||||
ackDeadlineSeconds: 60,
|
||||
};
|
||||
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.PUT,
|
||||
`/projects/${projectId}/subscriptions/${triggerId}`,
|
||||
auth.access_token,
|
||||
subscriptionConfig
|
||||
);
|
||||
|
||||
// Store trigger data for cleanup
|
||||
await context.store.put<TriggerData>('_trigger', {
|
||||
topicName: triggerId,
|
||||
subscriptionName: triggerId,
|
||||
notificationId: notificationResponse.id,
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
// Cleanup on failure
|
||||
try {
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/subscriptions/${triggerId}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
try {
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/topics/${triggerId}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
throw new Error(`Failed to setup Pub/Sub notifications: ${(error as any)?.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
onDisable: async (context) => {
|
||||
const triggerData = await context.store.get<TriggerData>('_trigger');
|
||||
if (!triggerData) return;
|
||||
|
||||
const { projectId } = context.propsValue;
|
||||
const { bucket } = context.propsValue;
|
||||
const auth = context.auth;
|
||||
|
||||
// Clean up in reverse order
|
||||
try {
|
||||
// Delete subscription
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/subscriptions/${triggerData.subscriptionName}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
try {
|
||||
// Delete notification config
|
||||
await gcsCommon.makeGCSRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/b/${bucket}/notificationConfigs/${triggerData.notificationId}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
try {
|
||||
// Delete topic
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/topics/${triggerData.topicName}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
},
|
||||
run: async (context) => {
|
||||
const payload = context.payload.body as any;
|
||||
|
||||
if (!payload?.message?.data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Decode Pub/Sub message
|
||||
const messageData = JSON.parse(
|
||||
Buffer.from(payload.message.data, 'base64').toString()
|
||||
);
|
||||
|
||||
// Extract GCS object from notification payload
|
||||
const gcsObject = messageData;
|
||||
|
||||
return [gcsObject];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,171 @@
|
||||
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
|
||||
import { googleCloudStorageAuth } from '../common/auth';
|
||||
import { gcsCommon } from '../common/client';
|
||||
import { bucketDropdown, projectIdProperty } from '../common/props';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
|
||||
interface TriggerData {
|
||||
topicName: string;
|
||||
subscriptionName: string;
|
||||
notificationId: string;
|
||||
}
|
||||
|
||||
export const objectUpdated = createTrigger({
|
||||
auth: googleCloudStorageAuth,
|
||||
name: 'object_updated',
|
||||
displayName: 'Object Updated',
|
||||
description: 'Triggers when an existing object is updated in a bucket',
|
||||
props: {
|
||||
projectId: projectIdProperty,
|
||||
bucket: bucketDropdown,
|
||||
prefix: Property.ShortText({
|
||||
displayName: 'Prefix Filter',
|
||||
description: 'Only trigger for objects with this prefix',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
kind: 'storage#object',
|
||||
id: 'example-bucket/example-object/1234567890',
|
||||
name: 'example-object.txt',
|
||||
bucket: 'example-bucket',
|
||||
generation: '1234567890',
|
||||
contentType: 'text/plain',
|
||||
timeCreated: '2023-01-01T00:00:00.000Z',
|
||||
updated: '2023-01-01T01:00:00.000Z',
|
||||
size: '2048',
|
||||
},
|
||||
onEnable: async (context) => {
|
||||
const { projectId, bucket, prefix } = context.propsValue;
|
||||
const auth = context.auth;
|
||||
|
||||
// Generate unique names for this trigger instance
|
||||
const triggerId = `ap-gcs-update-${bucket}-${Date.now()}`;
|
||||
const topicName = `projects/${projectId}/topics/${triggerId}`;
|
||||
const subscriptionName = `projects/${projectId}/subscriptions/${triggerId}`;
|
||||
|
||||
try {
|
||||
// 1. Create Pub/Sub topic
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.PUT,
|
||||
`/projects/${projectId}/topics/${triggerId}`,
|
||||
auth.access_token
|
||||
);
|
||||
|
||||
// 2. Create GCS notification configuration for metadata updates
|
||||
const notificationConfig: any = {
|
||||
topic: topicName,
|
||||
payload_format: 'JSON_API_V1',
|
||||
event_types: ['OBJECT_METADATA_UPDATE'],
|
||||
};
|
||||
|
||||
if (prefix) {
|
||||
notificationConfig.object_name_prefix = prefix;
|
||||
}
|
||||
|
||||
const notificationResponse = await gcsCommon.makeGCSRequest(
|
||||
HttpMethod.POST,
|
||||
`/b/${bucket}/notificationConfigs`,
|
||||
auth.access_token,
|
||||
notificationConfig
|
||||
);
|
||||
|
||||
// 3. Create Pub/Sub subscription with webhook push
|
||||
const subscriptionConfig = {
|
||||
topic: topicName,
|
||||
pushConfig: {
|
||||
pushEndpoint: context.webhookUrl,
|
||||
},
|
||||
ackDeadlineSeconds: 60,
|
||||
};
|
||||
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.PUT,
|
||||
`/projects/${projectId}/subscriptions/${triggerId}`,
|
||||
auth.access_token,
|
||||
subscriptionConfig
|
||||
);
|
||||
|
||||
// Store trigger data for cleanup
|
||||
await context.store.put<TriggerData>('_trigger', {
|
||||
topicName: triggerId,
|
||||
subscriptionName: triggerId,
|
||||
notificationId: notificationResponse.id,
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
// Cleanup on failure
|
||||
try {
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/subscriptions/${triggerId}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
try {
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/topics/${triggerId}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
throw new Error(`Failed to setup Pub/Sub notifications: ${(error as any)?.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
onDisable: async (context) => {
|
||||
const triggerData = await context.store.get<TriggerData>('_trigger');
|
||||
if (!triggerData) return;
|
||||
|
||||
const { projectId } = context.propsValue;
|
||||
const { bucket } = context.propsValue;
|
||||
const auth = context.auth;
|
||||
|
||||
// Clean up in reverse order
|
||||
try {
|
||||
// Delete subscription
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/subscriptions/${triggerData.subscriptionName}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
try {
|
||||
// Delete notification config
|
||||
await gcsCommon.makeGCSRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/b/${bucket}/notificationConfigs/${triggerData.notificationId}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
|
||||
try {
|
||||
// Delete topic
|
||||
await gcsCommon.makePubSubRequest(
|
||||
HttpMethod.DELETE,
|
||||
`/projects/${projectId}/topics/${triggerData.topicName}`,
|
||||
auth.access_token
|
||||
);
|
||||
} catch (e) { /* ignore */ }
|
||||
},
|
||||
run: async (context) => {
|
||||
const payload = context.payload.body as any;
|
||||
|
||||
if (!payload?.message?.data) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Decode Pub/Sub message
|
||||
const messageData = JSON.parse(
|
||||
Buffer.from(payload.message.data, 'base64').toString()
|
||||
);
|
||||
|
||||
// Extract GCS object from notification payload
|
||||
const gcsObject = messageData;
|
||||
|
||||
return [gcsObject];
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user