diff --git a/api/package.json b/api/package.json index 25395ec..09a7d56 100644 --- a/api/package.json +++ b/api/package.json @@ -92,7 +92,7 @@ }, "nodemonConfig": { "ignore": [ - "tmp/appStreamConfig.json" + "tmp/**/*" ] } } diff --git a/api/public/swagger.yaml b/api/public/swagger.yaml index 5aaa786..0e3f52f 100644 --- a/api/public/swagger.yaml +++ b/api/public/swagger.yaml @@ -161,6 +161,8 @@ components: $ref: '#/components/schemas/FolderMember' - $ref: '#/components/schemas/ServiceMember' + - + $ref: '#/components/schemas/FileMember' type: array required: - name @@ -172,20 +174,30 @@ components: enum: - service type: string - MemberType.file: - enum: - - file - type: string ServiceMember: properties: name: type: string type: - anyOf: - - - $ref: '#/components/schemas/MemberType.service' - - - $ref: '#/components/schemas/MemberType.file' + $ref: '#/components/schemas/MemberType.service' + code: + type: string + required: + - name + - type + - code + type: object + additionalProperties: false + MemberType.file: + enum: + - file + type: string + FileMember: + properties: + name: + type: string + type: + $ref: '#/components/schemas/MemberType.file' code: type: string required: @@ -203,6 +215,8 @@ components: $ref: '#/components/schemas/FolderMember' - $ref: '#/components/schemas/ServiceMember' + - + $ref: '#/components/schemas/FileMember' type: array required: - members diff --git a/api/src/controllers/internal/deploy.ts b/api/src/controllers/internal/deploy.ts index 662cea8..af6b830 100644 --- a/api/src/controllers/internal/deploy.ts +++ b/api/src/controllers/internal/deploy.ts @@ -1,11 +1,17 @@ import path from 'path' -import { MemberType, FolderMember, ServiceMember, FileTree } from '../../types' +import { + MemberType, + FolderMember, + ServiceMember, + FileTree, + FileMember +} from '../../types' import { getTmpFilesFolderPath } from '../../utils/file' import { createFolder, createFile, asyncForEach } from '@sasjs/utils' // REFACTOR: export FileTreeCpntroller export const createFileTree = async ( - members: (FolderMember | ServiceMember)[], + members: (FolderMember | ServiceMember | FileMember)[], parentFolders: string[] = [] ) => { const destinationPath = path.join( @@ -13,29 +19,32 @@ export const createFileTree = async ( path.join(...parentFolders) ) - await asyncForEach(members, async (member: FolderMember | ServiceMember) => { - let name = member.name + await asyncForEach( + members, + async (member: FolderMember | ServiceMember | FileMember) => { + let name = member.name - if (member.type === MemberType.service) name += '.sas' + if (member.type === MemberType.service) name += '.sas' - if (member.type === MemberType.folder) { - await createFolder(path.join(destinationPath, name)).catch((err) => - Promise.reject({ error: err, failedToCreate: name }) - ) + if (member.type === MemberType.folder) { + await createFolder(path.join(destinationPath, name)).catch((err) => + Promise.reject({ error: err, failedToCreate: name }) + ) - await createFileTree(member.members, [...parentFolders, name]).catch( - (err) => Promise.reject({ error: err, failedToCreate: name }) - ) - } else { - const encoding = member.type === MemberType.file ? 'base64' : undefined + await createFileTree(member.members, [...parentFolders, name]).catch( + (err) => Promise.reject({ error: err, failedToCreate: name }) + ) + } else { + const encoding = member.type === MemberType.file ? 'base64' : undefined - await createFile( - path.join(destinationPath, name), - member.code, - encoding - ).catch((err) => Promise.reject({ error: err, failedToCreate: name })) + await createFile( + path.join(destinationPath, name), + member.code, + encoding + ).catch((err) => Promise.reject({ error: err, failedToCreate: name })) + } } - }) + ) return Promise.resolve() } diff --git a/api/src/types/FileTree.ts b/api/src/types/FileTree.ts index 940a68e..2e95bc8 100644 --- a/api/src/types/FileTree.ts +++ b/api/src/types/FileTree.ts @@ -1,23 +1,28 @@ -export interface FileTree { - members: (FolderMember | ServiceMember)[] +export enum MemberType { + service = 'service', + file = 'file', + folder = 'folder' } -export enum MemberType { - folder = 'folder', - service = 'service', - file = 'file' +export interface ServiceMember { + name: string + type: MemberType.service + code: string +} + +export interface FileMember { + name: string + type: MemberType.file + code: string } export interface FolderMember { name: string type: MemberType.folder - members: (FolderMember | ServiceMember)[] + members: (FolderMember | ServiceMember | FileMember)[] } - -export interface ServiceMember { - name: string - type: MemberType.service | MemberType.file - code: string +export interface FileTree { + members: (FolderMember | ServiceMember | FileMember)[] } export const isFileTree = (arg: any): arg is FileTree => @@ -25,11 +30,25 @@ export const isFileTree = (arg: any): arg is FileTree => arg.members && Array.isArray(arg.members) && arg.members.filter( - (member: FolderMember | ServiceMember) => - !isFolderMember(member) && !isServiceMember(member) + (member: ServiceMember | FileMember | FolderMember) => + !isServiceMember(member, '-') && + !isFileMember(member, '-') && + !isFolderMember(member, '-') ).length === 0 -const isFolderMember = (arg: any): arg is FolderMember => +const isServiceMember = (arg: any, pre: string): arg is ServiceMember => + arg && + typeof arg.name === 'string' && + arg.type === MemberType.service && + typeof arg.code === 'string' + +const isFileMember = (arg: any, pre: string): arg is ServiceMember => + arg && + typeof arg.name === 'string' && + arg.type === MemberType.file && + typeof arg.code === 'string' + +const isFolderMember = (arg: any, pre: string): arg is FolderMember => arg && typeof arg.name === 'string' && arg.type === MemberType.folder && @@ -37,21 +56,7 @@ const isFolderMember = (arg: any): arg is FolderMember => Array.isArray(arg.members) && arg.members.filter( (member: FolderMember | ServiceMember) => - !isFolderMember(member) && - !isServiceMember(member) && - !isFileMember(member) + !isServiceMember(member, pre + '-') && + !isFileMember(member, pre + '-') && + !isFolderMember(member, pre + '-') ).length === 0 - -const isServiceMember = (arg: any): arg is ServiceMember => - arg && - typeof arg.name === 'string' && - arg.type === MemberType.service && - arg.code && - typeof arg.code === 'string' - -const isFileMember = (arg: any): arg is ServiceMember => - arg && - typeof arg.name === 'string' && - arg.type === MemberType.file && - arg.code && - typeof arg.code === 'string'