diff --git a/initializer-backend/pom.xml b/initializer-backend/pom.xml index 70108ffdc2c28b13df67303f990b1c5f3b9607cd..166ab9d925322bf4fb7ebf137d4e37e8f25ce018 100644 --- a/initializer-backend/pom.xml +++ b/initializer-backend/pom.xml @@ -46,6 +46,11 @@ org.eclipse.jgit org.eclipse.jgit + + org.gitlab4j + gitlab4j-api + 5.0.1 + diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java index 724f0944b04717302e1106293e9cf39ce7892fa5..78c0a4d280f9c5be76528ba4ee71b24cfa5f32da 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/InitializerBackendApplication.java @@ -1,17 +1,15 @@ package com.schbrain.archetype.initializer; -import com.schbrain.archetype.initializer.listener.ProjectWarmUpListener; +import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.scheduling.annotation.EnableScheduling; +@EnableScheduling @SpringBootApplication public class InitializerBackendApplication { public static void main(String[] args) { - SpringApplicationBuilder builder = new SpringApplicationBuilder(); - builder.listeners(new ProjectWarmUpListener()); - builder.sources(InitializerBackendApplication.class); - builder.run(args); + SpringApplication.run(InitializerBackendApplication.class, args); } } \ No newline at end of file diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..d05903dc818afd2ec3d097ce34796b288bdc4503 --- /dev/null +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/GitConfiguration.java @@ -0,0 +1,32 @@ +package com.schbrain.archetype.initializer.config; + +import com.schbrain.archetype.initializer.config.properties.GitProperties; +import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; +import org.gitlab4j.api.GitLabApi; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author liaozan + * @since 2022/4/28 + */ +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(GitProperties.class) +public class GitConfiguration { + + @Autowired + private GitProperties gitProperties; + + @Bean + public GitLabApi gitLabApi() { + return new GitLabApi(gitProperties.getServerUrl(), gitProperties.getPersonalAccessToken()); + } + + @Bean + public UsernamePasswordCredentialsProvider credentialsProvider() { + return new UsernamePasswordCredentialsProvider("PRIVATE-TOKEN", gitProperties.getPersonalAccessToken()); + } + +} \ No newline at end of file diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java new file mode 100644 index 0000000000000000000000000000000000000000..8005e0bde5bcbce262b9af8746789080b60545b0 --- /dev/null +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/config/properties/GitProperties.java @@ -0,0 +1,18 @@ +package com.schbrain.archetype.initializer.config.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author liaozan + * @since 2022/4/28 + */ +@Data +@ConfigurationProperties(prefix = "gitlab") +public class GitProperties { + + private String serverUrl; + + private String personalAccessToken; + +} \ No newline at end of file diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java new file mode 100644 index 0000000000000000000000000000000000000000..f60a6d04f48afed0e215533a9cacf84cae3d57f8 --- /dev/null +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/controller/GitlabController.java @@ -0,0 +1,26 @@ +package com.schbrain.archetype.initializer.controller; + +import cn.hutool.core.lang.tree.Tree; +import com.schbrain.archetype.initializer.schedule.GitlabGroupFetchTask; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author liaozan + * @since 2022/4/28 + */ +@RestController +public class GitlabController { + + @Autowired + private GitlabGroupFetchTask gitlabGroupFetchTask; + + @GetMapping("/gitlab/groups") + public List> groupList() { + return gitlabGroupFetchTask.getGroupTree(); + } + +} \ No newline at end of file diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java index d293daf788e0c06dc293e28301a9a2e7afe49f91..5afcb00fac9fa5c18ef3bb17688e9c1a5bdc9cfd 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/listener/ProjectWarmUpListener.java @@ -2,11 +2,11 @@ package com.schbrain.archetype.initializer.listener; import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; +import com.schbrain.common.util.EnvUtils; import lombok.SneakyThrows; -import org.springframework.boot.cloud.CloudPlatform; import org.springframework.boot.context.event.ApplicationStartedEvent; import org.springframework.context.ApplicationListener; -import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.stereotype.Component; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -15,6 +15,7 @@ import java.util.concurrent.Executors; * @author liaozan * @since 2022/3/20 */ +@Component public class ProjectWarmUpListener implements ApplicationListener { private final Executor executor = Executors.newSingleThreadExecutor(); @@ -22,15 +23,15 @@ public class ProjectWarmUpListener implements ApplicationListener { - ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam(); - mockParam.setGroupId("com.schbrain"); - mockParam.setArtifactId("schbrain-init"); - MavenUtils.generate(mockParam); - }); + if (!EnvUtils.runningOnCloudPlatform(event.getApplicationContext().getEnvironment())) { + return; } + executor.execute(() -> { + ArchetypeGenerateParam mockParam = new ArchetypeGenerateParam(); + mockParam.setGroupId("com.schbrain"); + mockParam.setArtifactId("schbrain-init"); + MavenUtils.generate(mockParam); + }); } } \ No newline at end of file diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java index 7e50bd81ee5fb24d34ddaf287e1e301bad04ff88..30eaefb967f9e25bd54d13706487aaff4fee8468 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/maven/MavenUtils.java @@ -1,6 +1,7 @@ package com.schbrain.archetype.initializer.maven; import cn.hutool.core.io.FileUtil; +import cn.hutool.extra.spring.SpringUtil; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.common.exception.BaseException; import com.schbrain.common.util.IdWorker; @@ -13,12 +14,19 @@ import org.apache.maven.settings.Settings; import org.apache.maven.settings.io.DefaultSettingsWriter; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.transport.CredentialsProvider; +import org.eclipse.jgit.transport.URIish; +import org.gitlab4j.api.GitLabApi; +import org.gitlab4j.api.GitLabApiException; +import org.gitlab4j.api.models.Group; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; +import java.util.List; import static org.apache.maven.cli.MavenCli.MULTIMODULE_PROJECT_DIRECTORY; @@ -31,6 +39,8 @@ public class MavenUtils { private static final File SETTINGS_FILE = new File(MavenCli.USER_MAVEN_CONFIGURATION_HOME, "settings.xml"); + private static final List ADDITIONAL_BRANCHES = List.of("release", "develop"); + static { System.getProperties().setProperty(MULTIMODULE_PROJECT_DIRECTORY, "$M2_HOME"); getSettingsFile(); @@ -53,7 +63,8 @@ public class MavenUtils { mavenCli.doMain(args, null, System.out, System.err); log.info("Generate archetype project at {}", outputDirectory); if (param.isInitGitRepo()) { - initGitRepo(Paths.get(archetype.getAbsolutePath(), param.getArtifactId())); + Path directory = Paths.get(archetype.getAbsolutePath(), param.getArtifactId()); + initGitRepo(directory, param.getRepoGroupId(), param); } return id; } @@ -63,15 +74,35 @@ public class MavenUtils { return new File(tmpDirPath, id); } - private static void initGitRepo(Path directory) { + private static void initGitRepo(Path directory, Long repoGroupId, ArchetypeGenerateParam param) { try { Git git = Git.init().setInitialBranch("master").setDirectory(directory.toFile()).call(); git.add().addFilepattern(".").call(); git.commit().setAllowEmpty(true).setAuthor("initializer", "no-reply@schbrain.com").setMessage("Initial Commit").call(); - git.checkout().setCreateBranch(true).setName("release").call(); - git.checkout().setCreateBranch(true).setName("develop").call(); + + boolean pushToRemote = repoGroupId != null; + if (pushToRemote) { + GitLabApi gitLabApi = SpringUtil.getBean(GitLabApi.class); + Group group = gitLabApi.getGroupApi().getGroup(repoGroupId); + String groupPath = group.getFullPath(); + String repositoryUrl = String.format("%s/%s/%s.git", gitLabApi.getGitLabServerUrl(), groupPath, param.getArtifactId()); + URIish urIish = new URIish(repositoryUrl); + git.remoteSetUrl().setRemoteName("origin").setRemoteUri(urIish).call(); + } + + for (String branch : ADDITIONAL_BRANCHES) { + git.checkout().setName(branch).setCreateBranch(true).call(); + } + if (pushToRemote) { + git.push() + .setRemote("origin") + .setCredentialsProvider(SpringUtil.getBean(CredentialsProvider.class)) + .setPushAll() + .setForce(true) + .call(); + } git.close(); - } catch (GitAPIException e) { + } catch (GitAPIException | GitLabApiException | URISyntaxException e) { log.warn("Git repo init failed", e); throw new BaseException("Git仓库初始化失败"); } diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java index 7cdf493fac2dbea2ba9869d0168b9541e7abf800..a2e409095fa7b9e37c02cdb72c23aea2e70c3517 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/param/ArchetypeGenerateParam.java @@ -40,6 +40,10 @@ public class ArchetypeGenerateParam { * 是否初始化 git 仓库 */ private boolean initGitRepo; + /** + * 仓库 groupId + */ + private Long repoGroupId; public String getSubModuleNamePrefix() { if (!StringUtils.hasText(this.subModuleNamePrefix)) { diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java index 9066f4f0c1a9bb29c233e06907ddeffde0cb7075..cdd7b5e7d2b787ed2798de9d6e81db139f8ba696 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/runner/ArchetypePreparer.java @@ -43,13 +43,12 @@ public class ArchetypePreparer implements ApplicationRunner { } private void checkoutArchetype(File archetypeTemplateDirectory) { - try { - Git.cloneRepository() - .setTagOption(TagOpt.FETCH_TAGS) - .setNoCheckout(false) - .setDirectory(archetypeTemplateDirectory) - .setURI(ARCHETYPE_REPO_URL) - .call(); + try (Git ignored = Git.cloneRepository() + .setTagOption(TagOpt.FETCH_TAGS) + .setNoCheckout(false) + .setDirectory(archetypeTemplateDirectory) + .setURI(ARCHETYPE_REPO_URL) + .call()) { log.info("Success checkout archetype source from {}", ARCHETYPE_REPO_URL); } catch (GitAPIException e) { throw new BaseException("Failed to checkout archetype source from git repository", e); diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java new file mode 100644 index 0000000000000000000000000000000000000000..89aa484ed742bd61c6470901b2e3565b8bd46940 --- /dev/null +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/schedule/GitlabGroupFetchTask.java @@ -0,0 +1,55 @@ +package com.schbrain.archetype.initializer.schedule; + +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import lombok.extern.slf4j.Slf4j; +import org.gitlab4j.api.GitLabApi; +import org.gitlab4j.api.GroupApi; +import org.gitlab4j.api.models.Group; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author liaozan + * @since 2022/4/28 + */ +@Slf4j +@Component +public class GitlabGroupFetchTask { + + @Autowired + private GitLabApi gitLabApi; + + private List> groupTree = Collections.emptyList(); + + public List> getGroupTree() { + return groupTree; + } + + @Scheduled(fixedRate = 1, timeUnit = TimeUnit.HOURS) + public void fetchGroups() { + try { + GroupApi groupApi = gitLabApi.getGroupApi(); + List groups = groupApi.getGroups(); + List> treeNodes = groups.stream() + .map(group -> { + TreeNode treeNode = new TreeNode<>(); + treeNode.setId(group.getId()); + treeNode.setName(group.getName()); + treeNode.setParentId(group.getParentId()); + return treeNode; + }).collect(Collectors.toList()); + this.groupTree = TreeUtil.build(treeNodes, null); + } catch (Exception e) { + log.warn("Failed to fetch Gitlab groups", e); + } + } + +} \ No newline at end of file diff --git a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java index baeeddf65e50600e294814c9ce80cf065a31ee6a..6bae63a899ed84aa09574305959a30f92ee70def 100644 --- a/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java +++ b/initializer-backend/src/main/java/com/schbrain/archetype/initializer/service/ArchetypeService.java @@ -3,11 +3,13 @@ package com.schbrain.archetype.initializer.service; import cn.hutool.cache.impl.TimedCache; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ZipUtil; +import com.schbrain.archetype.initializer.config.properties.GitProperties; import com.schbrain.archetype.initializer.maven.MavenUtils; import com.schbrain.archetype.initializer.param.ArchetypeGenerateParam; import com.schbrain.archetype.initializer.response.PreviewFileTree; import com.schbrain.archetype.initializer.runner.ArchetypePreparer; import com.schbrain.common.util.ServletUtils; +import org.gitlab4j.api.GitLabApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; @@ -38,6 +40,10 @@ public class ArchetypeService { @Autowired private ArchetypePreparer archetypePreparer; + @Autowired + private GitLabApi gitLabApi; + @Autowired + private GitProperties gitProperties; public String generate(ArchetypeGenerateParam param) { String generateId = MavenUtils.generate(param); diff --git a/initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json b/initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000000000000000000000000000000000000..c0626d1ca7bba18b01252a073e58ea7022938f40 --- /dev/null +++ b/initializer-backend/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,22 @@ +{ + "groups": [ + { + "name": "gitlab", + "type": "com.schbrain.archetype.initializer.config.properties.GitProperties", + "sourceType": "com.schbrain.archetype.initializer.config.properties.GitProperties" + } + ], + "properties": [ + { + "name": "gitlab.personal-access-token", + "type": "java.lang.String", + "sourceType": "com.schbrain.archetype.initializer.config.properties.GitProperties" + }, + { + "name": "gitlab.server-url", + "type": "java.lang.String", + "sourceType": "com.schbrain.archetype.initializer.config.properties.GitProperties" + } + ], + "hints": [] +} \ No newline at end of file diff --git a/initializer-backend/src/main/resources/application.yaml b/initializer-backend/src/main/resources/application.yaml index 212b5b67d7133266b5bd59dd862e65b0db392be7..2a1bdfefb0bf2f4af1e8d8e7c2776236ff389cad 100644 --- a/initializer-backend/src/main/resources/application.yaml +++ b/initializer-backend/src/main/resources/application.yaml @@ -3,4 +3,7 @@ spring: name: initializer-backend web: resources: - add-mappings: true \ No newline at end of file + add-mappings: true +gitlab: + server-url: http://gitlab.schbrain.com/gitlab + personal-access-token: AzRH1rZ2HysUkHeycsaU \ No newline at end of file diff --git a/initializer-ui/package.json b/initializer-ui/package.json index 4011581dec237ed08f1da20f56504d34431f1b69..f4014f47aa80b5deede4512408c6436bf98ebb8d 100644 --- a/initializer-ui/package.json +++ b/initializer-ui/package.json @@ -7,15 +7,15 @@ }, "dependencies": { "vue": "^3.2.33", - "axios": "^0.26.1", - "ant-design-vue": "^3.2.0", + "axios": "^0.27.2", + "ant-design-vue": "^3.2.2", "highlight.js": "^11.5.1", "@highlightjs/vue-plugin": "^2.1.0" }, "devDependencies": { "@vitejs/plugin-vue": "^2.3.1", - "typescript": "^4.6.3", - "vite": "^2.9.5", - "vue-tsc": "^0.34.8" + "typescript": "^4.6.4", + "vite": "^2.9.7", + "vue-tsc": "^0.34.11" } } \ No newline at end of file diff --git a/initializer-ui/src/App.vue b/initializer-ui/src/App.vue index ae33f4bf643fe22c82c34c0f86dd650cb8d9689a..e4961eb5c1748c78de7969d1bbb3c452fe42aea2 100644 --- a/initializer-ui/src/App.vue +++ b/initializer-ui/src/App.vue @@ -1,6 +1,14 @@ \ No newline at end of file +import Starter from "./components/starter.vue" +import zhCN from 'ant-design-vue/es/locale/zh_CN'; +import {ref} from "vue"; + +const locale = ref(zhCN); + \ No newline at end of file diff --git a/initializer-ui/src/components/starter.vue b/initializer-ui/src/components/starter.vue index bbdb3a165c628f10d51dd586c5e2f3de37444178..3c6373666ba54243f3ab8ee482e071d27c9f77e5 100644 --- a/initializer-ui/src/components/starter.vue +++ b/initializer-ui/src/components/starter.vue @@ -15,8 +15,14 @@ + + + + + + - 初始化 Git 仓库 + 初始化 Git 仓库
@@ -27,13 +33,17 @@ - + + + + +
@@ -51,6 +61,8 @@ interface FormState { version: string, packageName: string, initGitRepo: boolean + repoGroup: string + repoGroupId: number } interface FileNode { @@ -60,11 +72,20 @@ interface FileNode { isFile: boolean } +interface GroupNode { + id: number, + name: string, + children: GroupNode[], +} + const fileNodeList = ref([]) -const treeData = ref([]) +const groupNodeList = ref([]) +const fileTreeData = ref([]) +const gitlabGroupTreeData = ref([]) const id = ref(-1) const structPreviewVisible = ref(false) const contentPreviewVisible = ref(false) +const gitlabGroupVisible = ref(false) const fileContent = ref() const fileExtension = ref() const loading = computed(() => isLoading.value) @@ -75,7 +96,9 @@ const formState = reactive({ artifactId: '', version: '1.0.0-SNAPSHOT', packageName: '', - initGitRepo: true + initGitRepo: false, + repoGroup: '', + repoGroupId: -1 }) const formRules = { @@ -83,6 +106,17 @@ const formRules = { artifactId: [{required: true, message: '请输入artifactId', trigger: 'change'}], } +const fetchGroupTreeList = async (initGitRepo: boolean) => { + if (initGitRepo) { + groupNodeList.value = await fetchGroupList() + gitlabGroupTreeData.value = createGroupTreeData(groupNodeList.value) + gitlabGroupVisible.value = true + } else { + formState.repoGroup = '' + formState.repoGroupId = -1 + } +} + const onGenerate = async () => { let result = await downloadForm.value?.validate() if (result) { @@ -90,6 +124,13 @@ const onGenerate = async () => { result.packageName = result.groupId } + if (result.initGitRepo) { + if (result.repoGroupId === -1) { + message.warn('Gitlab 群组不能为空!') + return + } + } + let data: BaseResponse = await request.post('/archetype/generate', result) if (data.code === 0) { id.value = data.result @@ -100,7 +141,7 @@ const onGenerate = async () => { const onPreview = async () => { fileNodeList.value = await fetchFileList(id.value) - treeData.value = createTreeData(fileNodeList.value) + fileTreeData.value = createFileTreeData(fileNodeList.value) structPreviewVisible.value = true } @@ -111,13 +152,26 @@ const onDownload = async (id: number) => { downloadGeneratedProject(data, fileName) } -const onSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => { +const onFileTreeNodeSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => { const {node} = event fileContent.value = node.fileContent fileExtension.value = node.title.substring(node.title.lastIndexOf('.') + 1) contentPreviewVisible.value = true } +const onGroupTreeNodeSelect = async (selectedKeys: string[], event: { node: TreeDataNode }) => { + const {node} = event + formState.repoGroupId = node.key as number + formState.repoGroup = node.title +} + +const onGroupModalClose = async () => { + if (formState.repoGroupId === -1) { + formState.initGitRepo = false + } + gitlabGroupVisible.value = false +} + const downloadGeneratedProject = (data: BlobPart, fileName: string) => { const blob = new Blob([data]) const link = document.createElement('a') @@ -137,7 +191,14 @@ const fetchFileList = async (id: number) => { } } -const createTreeData = (fileNodeList: FileNode[]): any => { +const fetchGroupList = async () => { + let data: BaseResponse = await request.get(`/gitlab/groups`) + if (data.code === 0) { + return data.result + } +} + +const createFileTreeData = (fileNodeList: FileNode[]): any => { if (!fileNodeList) { return [] } @@ -145,13 +206,28 @@ const createTreeData = (fileNodeList: FileNode[]): any => { return { key: Math.random(), title: item.fileName, - children: createTreeData(item.children), + children: createFileTreeData(item.children), selectable: item.isFile, isLeaf: item.isFile, fileContent: item.fileContent } }) } + +const createGroupTreeData = (groupNodeList: GroupNode[]): any => { + if (!groupNodeList) { + return [] + } + return groupNodeList.map((item: GroupNode) => { + return { + key: item.id, + title: item.name, + children: createGroupTreeData(item.children), + selectable: true, + isLeaf: !item.children + } + }) +}