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:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-google-cloud-storage
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-google-cloud-storage` to build the library.

View File

@@ -0,0 +1,10 @@
{
"name": "@activepieces/piece-google-cloud-storage",
"version": "0.0.2",
"type": "commonjs",
"main": "./src/index.js",
"types": "./src/index.d.ts",
"dependencies": {
"tslib": "^2.3.0"
}
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-google-cloud-storage",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/google-cloud-storage/src",
"projectType": "library",
"release": {
"version": {
"manifestRootsToUpdate": [
"dist/{projectRoot}"
],
"currentVersionResolver": "git-tag",
"fallbackCurrentVersionResolver": "disk"
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/google-cloud-storage",
"tsConfig": "packages/pieces/community/google-cloud-storage/tsconfig.lib.json",
"packageJson": "packages/pieces/community/google-cloud-storage/package.json",
"main": "packages/pieces/community/google-cloud-storage/src/index.ts",
"assets": [
"packages/pieces/community/google-cloud-storage/*.md",
{
"input": "packages/pieces/community/google-cloud-storage/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/google-cloud-storage",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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": "このプレフィックスを持つオブジェクトのトリガーのみ"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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,
],
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'}`);
}
},
});

View File

@@ -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'
],
});

View File

@@ -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);
},
};

View File

@@ -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' },
],
},
});

View File

@@ -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];
},
});

View File

@@ -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];
},
});

View File

@@ -0,0 +1,20 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"importHelpers": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,9 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"include": ["src/**/*.ts"]
}