diff --git a/packages/clients/src/api/secret/v1alpha1/api.gen.ts b/packages/clients/src/api/secret/v1alpha1/api.gen.ts index 5d02b8d58..9020c166e 100644 --- a/packages/clients/src/api/secret/v1alpha1/api.gen.ts +++ b/packages/clients/src/api/secret/v1alpha1/api.gen.ts @@ -9,12 +9,15 @@ import { import type { Region } from '../../../bridge' import { marshalAddSecretOwnerRequest, + marshalCreateFolderRequest, marshalCreateSecretRequest, marshalCreateSecretVersionRequest, marshalGeneratePasswordRequest, marshalUpdateSecretRequest, marshalUpdateSecretVersionRequest, unmarshalAccessSecretVersionResponse, + unmarshalFolder, + unmarshalListFoldersResponse, unmarshalListSecretVersionsResponse, unmarshalListSecretsResponse, unmarshalListTagsResponse, @@ -26,17 +29,22 @@ import type { AccessSecretVersionRequest, AccessSecretVersionResponse, AddSecretOwnerRequest, + CreateFolderRequest, CreateSecretRequest, CreateSecretVersionRequest, + DeleteFolderRequest, DeleteSecretRequest, DestroySecretVersionRequest, DisableSecretVersionRequest, EnableSecretVersionRequest, + Folder, GeneratePasswordRequest, GetSecretByNameRequest, GetSecretRequest, GetSecretVersionByNameRequest, GetSecretVersionRequest, + ListFoldersRequest, + ListFoldersResponse, ListSecretVersionsByNameRequest, ListSecretVersionsRequest, ListSecretVersionsResponse, @@ -67,7 +75,7 @@ export class API extends ParentAPI { public static readonly LOCALITIES: Region[] = ['fr-par'] /** - * Create a secret. You must sepcify the `region` to create a secret. + * Create a secret. You must specify the `region` to create a secret. * * @param request - The request {@link CreateSecretRequest} * @returns A Promise of Secret @@ -88,6 +96,28 @@ export class API extends ParentAPI { unmarshalSecret, ) + /** + * Create folder. + * + * @param request - The request {@link CreateFolderRequest} + * @returns A Promise of Folder + */ + createFolder = (request: Readonly) => + this.client.fetch( + { + body: JSON.stringify( + marshalCreateFolderRequest(request, this.client.settings), + ), + headers: jsonContentHeaders, + method: 'POST', + path: `/secret-manager/v1alpha1/regions/${validatePathParam( + 'region', + request.region ?? this.client.settings.defaultRegion, + )}/folders`, + }, + unmarshalFolder, + ) + /** * Get metadata using the secret's ID. Retrieve the metadata of a secret * specified by the `region` and `secret_id` parameters. @@ -111,6 +141,11 @@ export class API extends ParentAPI { * Get metadata using the secret's name. Retrieve the metadata of a secret * specified by the `region` and `secret_name` parameters. * + * GetSecretByName usage is now deprecated. + * + * Scaleway recommends you to use ListSecrets with the `name` filter. + * + * @deprecated * @param request - The request {@link GetSecretByNameRequest} * @returns A Promise of Secret */ @@ -172,6 +207,7 @@ export class API extends ParentAPI { 'page_size', request.pageSize ?? this.client.settings.defaultPageSize, ], + ['path', request.path], ['project_id', request.projectId], ['tags', request.tags], ), @@ -190,6 +226,40 @@ export class API extends ParentAPI { listSecrets = (request: Readonly = {}) => enrichForPagination('secrets', this.pageOfListSecrets, request) + protected pageOfListFolders = (request: Readonly = {}) => + this.client.fetch( + { + method: 'GET', + path: `/secret-manager/v1alpha1/regions/${validatePathParam( + 'region', + request.region ?? this.client.settings.defaultRegion, + )}/folders`, + urlParams: urlParams( + ['order_by', request.orderBy ?? 'created_at_asc'], + ['page', request.page], + [ + 'page_size', + request.pageSize ?? this.client.settings.defaultPageSize, + ], + ['path', request.path], + [ + 'project_id', + request.projectId ?? this.client.settings.defaultProjectId, + ], + ), + }, + unmarshalListFoldersResponse, + ) + + /** + * List secrets. Retrieve the list of folders created within a Project. + * + * @param request - The request {@link ListFoldersRequest} + * @returns A Promise of ListFoldersResponse + */ + listFolders = (request: Readonly = {}) => + enrichForPagination('folders', this.pageOfListFolders, request) + /** * Delete a secret. Delete a given secret specified by the `region` and * `secret_id` parameters. @@ -205,6 +275,20 @@ export class API extends ParentAPI { )}/secrets/${validatePathParam('secretId', request.secretId)}`, }) + /** + * Delete a given folder specified by the and `folder_id` parameter. + * + * @param request - The request {@link DeleteFolderRequest} + */ + deleteFolder = (request: Readonly) => + this.client.fetch({ + method: 'DELETE', + path: `/secret-manager/v1alpha1/regions/${validatePathParam( + 'region', + request.region ?? this.client.settings.defaultRegion, + )}/folders/${validatePathParam('folderId', request.folderId)}`, + }) + /** * Protect a secret. Protect a given secret specified by the `secret_id` * parameter. A protected secret can be read and modified but cannot be diff --git a/packages/clients/src/api/secret/v1alpha1/index.gen.ts b/packages/clients/src/api/secret/v1alpha1/index.gen.ts index 1872e8351..cd7d9176d 100644 --- a/packages/clients/src/api/secret/v1alpha1/index.gen.ts +++ b/packages/clients/src/api/secret/v1alpha1/index.gen.ts @@ -6,17 +6,23 @@ export type { AccessSecretVersionRequest, AccessSecretVersionResponse, AddSecretOwnerRequest, + CreateFolderRequest, CreateSecretRequest, CreateSecretVersionRequest, + DeleteFolderRequest, DeleteSecretRequest, DestroySecretVersionRequest, DisableSecretVersionRequest, EnableSecretVersionRequest, + Folder, GeneratePasswordRequest, GetSecretByNameRequest, GetSecretRequest, GetSecretVersionByNameRequest, GetSecretVersionRequest, + ListFoldersRequest, + ListFoldersRequestOrderBy, + ListFoldersResponse, ListSecretVersionsByNameRequest, ListSecretVersionsRequest, ListSecretVersionsResponse, diff --git a/packages/clients/src/api/secret/v1alpha1/marshalling.gen.ts b/packages/clients/src/api/secret/v1alpha1/marshalling.gen.ts index f1f5ba7d7..27ff6e2c7 100644 --- a/packages/clients/src/api/secret/v1alpha1/marshalling.gen.ts +++ b/packages/clients/src/api/secret/v1alpha1/marshalling.gen.ts @@ -10,9 +10,12 @@ import type { DefaultValues } from '../../../bridge' import type { AccessSecretVersionResponse, AddSecretOwnerRequest, + CreateFolderRequest, CreateSecretRequest, CreateSecretVersionRequest, + Folder, GeneratePasswordRequest, + ListFoldersResponse, ListSecretVersionsResponse, ListSecretsResponse, ListTagsResponse, @@ -23,6 +26,22 @@ import type { UpdateSecretVersionRequest, } from './types.gen' +export const unmarshalFolder = (data: unknown) => { + if (!isJSONObject(data)) { + throw new TypeError( + `Unmarshalling the type 'Folder' failed as data isn't a dictionary.`, + ) + } + + return { + createdAt: unmarshalDate(data.created_at), + id: data.id, + name: data.name, + path: data.path, + projectId: data.project_id, + } as Folder +} + export const unmarshalSecret = (data: unknown) => { if (!isJSONObject(data)) { throw new TypeError( @@ -37,6 +56,7 @@ export const unmarshalSecret = (data: unknown) => { isManaged: data.is_managed, isProtected: data.is_protected, name: data.name, + path: data.path, projectId: data.project_id, region: data.region, status: data.status, @@ -80,6 +100,19 @@ export const unmarshalAccessSecretVersionResponse = (data: unknown) => { } as AccessSecretVersionResponse } +export const unmarshalListFoldersResponse = (data: unknown) => { + if (!isJSONObject(data)) { + throw new TypeError( + `Unmarshalling the type 'ListFoldersResponse' failed as data isn't a dictionary.`, + ) + } + + return { + folders: unmarshalArrayOfObject(data.folders, unmarshalFolder), + totalCount: data.total_count, + } as ListFoldersResponse +} + export const unmarshalListSecretVersionsResponse = (data: unknown) => { if (!isJSONObject(data)) { throw new TypeError( @@ -135,12 +168,22 @@ export const marshalAddSecretOwnerRequest = ( product_name: request.productName, }) +export const marshalCreateFolderRequest = ( + request: CreateFolderRequest, + defaults: DefaultValues, +): Record => ({ + name: request.name, + path: request.path, + project_id: request.projectId ?? defaults.defaultProjectId, +}) + export const marshalCreateSecretRequest = ( request: CreateSecretRequest, defaults: DefaultValues, ): Record => ({ description: request.description, name: request.name, + path: request.path, project_id: request.projectId ?? defaults.defaultProjectId, tags: request.tags, type: request.type ?? 'unknown_secret_type', @@ -183,6 +226,7 @@ export const marshalUpdateSecretRequest = ( ): Record => ({ description: request.description, name: request.name, + path: request.path, tags: request.tags, }) diff --git a/packages/clients/src/api/secret/v1alpha1/types.gen.ts b/packages/clients/src/api/secret/v1alpha1/types.gen.ts index 2cb5ef68f..e650c525f 100644 --- a/packages/clients/src/api/secret/v1alpha1/types.gen.ts +++ b/packages/clients/src/api/secret/v1alpha1/types.gen.ts @@ -2,6 +2,12 @@ // If you have any remark or suggestion do not hesitate to open an issue. import type { Region } from '../../../bridge' +export type ListFoldersRequestOrderBy = + | 'created_at_asc' + | 'created_at_desc' + | 'name_asc' + | 'name_desc' + export type ListSecretsRequestOrderBy = | 'name_asc' | 'name_desc' @@ -40,6 +46,28 @@ export interface AccessSecretVersionResponse { dataCrc32?: number } +/** Folder. */ +export interface Folder { + /** ID of the folder. */ + id: string + /** ID of the Project containing the folder. */ + projectId: string + /** Name of the folder. */ + name: string + /** Path of the folder. Location of the folder in the directory structure. */ + path: string + /** Date and time of the folder's creation. */ + createdAt?: Date +} + +/** List folders response. */ +export interface ListFoldersResponse { + /** List of folders. */ + folders: Folder[] + /** Count of all folders matching the requested criteria. */ + totalCount: number +} + /** List secret versions response. */ export interface ListSecretVersionsResponse { /** Single page of versions. */ @@ -108,6 +136,8 @@ export interface Secret { isProtected: boolean /** Type of the secret. See `Secret.Type` enum for description of values. */ type: SecretType + /** Path of the secret. Location of the secret in the directory structure. */ + path: string /** Region of the secret. */ region: Region } @@ -157,6 +187,28 @@ export type CreateSecretRequest = { * values. If not specified, the type is `Opaque`. */ type?: SecretType + /** + * Path of the secret. (Optional.) Location of the secret in the directory + * structure. If not specified, the path is `/`. + */ + path?: string +} + +export type CreateFolderRequest = { + /** + * Region to target. If none is passed will use default region from the + * config. + */ + region?: Region + /** ID of the Project containing the folder. */ + projectId?: string + /** Name of the folder. */ + name: string + /** + * Path of the folder. (Optional.) Location of the folder in the directory + * structure. If not specified, the path is `/`. + */ + path?: string } export type GetSecretRequest = { @@ -198,6 +250,11 @@ export type UpdateSecretRequest = { tags?: string[] /** Description of the secret. */ description?: string + /** + * Path of the folder. (Optional.) Location of the folder in the directory + * structure. If not specified, the path is `/`. + */ + path?: string } export type ListSecretsRequest = { @@ -219,6 +276,23 @@ export type ListSecretsRequest = { name?: string /** Filter by managed / not managed (optional). */ isManaged?: boolean + /** Filter by path (optional). */ + path?: string +} + +export type ListFoldersRequest = { + /** + * Region to target. If none is passed will use default region from the + * config. + */ + region?: Region + /** ID of the Project. */ + projectId?: string + /** Filter by path (optional). */ + path?: string + page?: number + pageSize?: number + orderBy?: ListFoldersRequestOrderBy } export type DeleteSecretRequest = { @@ -231,6 +305,16 @@ export type DeleteSecretRequest = { secretId: string } +export type DeleteFolderRequest = { + /** + * Region to target. If none is passed will use default region from the + * config. + */ + region?: Region + /** ID of the folder. */ + folderId: string +} + export type ProtectSecretRequest = { /** * Region to target. If none is passed will use default region from the