Skip to content

Commit

Permalink
Forced project folder
Browse files Browse the repository at this point in the history
  • Loading branch information
hdurix committed Jul 8, 2022
1 parent fe97ae3 commit 869362f
Show file tree
Hide file tree
Showing 44 changed files with 262 additions and 44 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package tech.jhipster.lite.generator.project.infrastructure.primary.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import io.swagger.v3.oas.annotations.media.Schema;
import java.util.Map;
import tech.jhipster.lite.error.domain.Assert;
import tech.jhipster.lite.generator.project.domain.Project;
import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties;
import tech.jhipster.lite.technical.infrastructure.primary.jackson.JacksonProjectFolderDeserializer;

@Schema(description = "Project DTO")
public class ProjectDTO {

@JsonProperty("folder")
@JsonDeserialize(using = JacksonProjectFolderDeserializer.class)
@Schema(description = "folder", example = "/tmp/jhlite/jhipster", required = true)
private String folder;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package tech.jhipster.lite.generator.project.infrastructure.primary.rest;

import java.util.UUID;
import org.apache.commons.lang3.SystemUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/project-folders")
class ProjectFoldersResource {

@Value("${application.forced-project-folder:}")
private String forcedProjectFolder;

@GetMapping
public String getAvailableFolderName() {
return rootFolder().replaceAll("([^/])$", "$1/") + UUID.randomUUID();
}

private String rootFolder() {
if (forcedProjectFolder.isBlank()) {
return SystemUtils.JAVA_IO_TMPDIR;
}

return forcedProjectFolder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

record JHipsterModulesResources(Collection<JHipsterModuleResource> modulesResources) {
public JHipsterModulesResources {
Assert.field("modulesrouces", modulesResources).noNullElement().notEmpty();
Assert.field("modulesResources", modulesResources).noNullElement().notEmpty();

assertUniqSlugs(modulesResources);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package tech.jhipster.lite.technical.infrastructure.primary.jackson;

import tech.jhipster.lite.error.domain.GeneratorException;

public class InvalidProjectFolderException extends GeneratorException {

public InvalidProjectFolderException(String fixedFolderPath) {
super("Should start with " + fixedFolderPath);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package tech.jhipster.lite.technical.infrastructure.primary.jackson;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import tech.jhipster.lite.error.domain.GeneratorException;
import tech.jhipster.lite.technical.infrastructure.primary.exception.BadRequestAlertException;

@Component
public class JacksonProjectFolderDeserializer extends JsonDeserializer<String> {

@Value("${application.forced-project-folder:}")
private String forcedProjectFolder;

@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
String text = jsonParser.getText();
if (!text.startsWith(forcedProjectFolder) || text.contains("..")) {
throw new InvalidProjectFolderException(forcedProjectFolder);
}
return text;
}
}
1 change: 1 addition & 0 deletions src/main/resources/config/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ application.cors.allowed-origin-patterns=https://*.githubpreview.dev

application.cmd.timeout=120
application.version=@project.version@
#application.forced-project-folder=/tmp/jhlite

# Spring Boot Actuator
management.endpoints.web.base-path=/management
Expand Down
3 changes: 3 additions & 0 deletions src/main/webapp/app/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import '../content/css/custom.css';
import { MittAlertListener } from '@/common/secondary/alert/MittAlertListener';
import { RestModulesRepository } from './module/secondary/RestModulesRepository';
import SetupRepository from '@/springboot/secondary/SetupRepository';
import ProjectFolderRepository from '@/springboot/secondary/ProjectFolderRepository';

const app = createApp(App);
const pinia = createPinia();
Expand All @@ -42,6 +43,7 @@ const historyStore = useHistoryStore();
const projectStore = useProjectStore();
const projectHistoryRepository = new ProjectHistoryRepository(axiosHttp, historyStore);
const projectRepository = new ProjectRepository(axiosHttp, projectHistoryRepository, projectStore);
const projectFolderRepository = new ProjectFolderRepository(axiosHttp);
const angularRepository = new AngularRepository(axiosHttp, projectHistoryRepository);
const reactRepository = new ReactRepository(axiosHttp, projectHistoryRepository);
const springBootRepository = new SpringBootRepository(axiosHttp, projectHistoryRepository);
Expand All @@ -59,6 +61,7 @@ app.provide('historyStore', historyStore);
app.provide('projectStore', projectStore);
app.provide('logger', consoleLogger);
app.provide('projectService', projectRepository);
app.provide('projectFolderService', projectFolderRepository);
app.provide('projectHistoryService', projectHistoryRepository);
app.provide('reactService', reactRepository);
app.provide('springBootService', springBootRepository);
Expand Down
1 change: 1 addition & 0 deletions src/main/webapp/app/springboot/domain/FolderName.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export type FolderName = string;
5 changes: 5 additions & 0 deletions src/main/webapp/app/springboot/domain/ProjectFolderService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { FolderName } from '@/springboot/domain/FolderName';

export interface ProjectFolderService {
get(): Promise<FolderName>;
}
4 changes: 4 additions & 0 deletions src/main/webapp/app/springboot/primary/Generator.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { StoreGeneric } from 'pinia';
import { SetupGeneratorVue } from '@/springboot/primary/generator/setup-generator';
import { AlertBus } from '@/common/domain/alert/AlertBus';
import { FileDownloader } from '@/common/primary/FileDownloader';
import { ProjectFolderService } from '@/springboot/domain/ProjectFolderService';

export default defineComponent({
name: 'GeneratorComponent',
Expand All @@ -34,6 +35,7 @@ export default defineComponent({
setup() {
const projectHistoryService = inject('projectHistoryService') as ProjectHistoryService;
const projectService = inject('projectService') as ProjectService;
const projectFolderService = inject('projectFolderService') as ProjectFolderService;
const globalWindow = inject('globalWindow') as Window;
const projectStore = inject('projectStore') as StoreGeneric;
const selectorPrefix = 'generator';
Expand All @@ -56,6 +58,8 @@ export default defineComponent({
project.value.serverPort = state.project.serverPort ?? project.value.serverPort;
});

projectFolderService.get().then(folderName => (project.value.folder = folderName));

let timeoutId: number | undefined = undefined;
const getCurrentProjectHistory = (): Promise<History> => projectHistoryService.get(project.value.folder);
const getProjectDetails = (): Promise<void> => projectService.getProjectDetails(project.value.folder);
Expand Down
2 changes: 1 addition & 1 deletion src/main/webapp/app/springboot/primary/Generator.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
<label for="path" class="form-label">Path (required) : </label>
<input
id="path"
placeholder="/tmp/myapp"
v-model="project.folder"
type="text"
class="form-control"
required
autofocus
:data-selector="selectorPrefix + '.project-folder'"
@input="debounceGetProjectDetails"
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { AxiosHttp } from '@/http/AxiosHttp';
import { ProjectFolderService } from '@/springboot/domain/ProjectFolderService';
import { FolderName } from '@/springboot/domain/FolderName';

export default class ProjectFolderRepository implements ProjectFolderService {
constructor(private axiosHttp: AxiosHttp) {}

async get(): Promise<FolderName> {
return await this.axiosHttp.get<FolderName>('api/project-folders').then(res => res.data);
}
}
2 changes: 1 addition & 1 deletion src/test/java/tech/jhipster/lite/IntegrationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
@SpringBootTest(classes = { JHLiteApp.class })
@Target(ElementType.TYPE)
public @interface IntegrationTest {
public String[] properties() default {};
String[] properties() default {};
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.buildtool.gradle.domain;

import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.common.domain.FileUtils.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.ci.github.actions.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.client.angular.core.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.generator.project.domain.ProjectFilesAsserter.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.client.angular.security.jwt.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.groups.Tuple.tuple;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.generator.client.angular.security.oauth2.domain.AngularOauth2.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.client.react.core.domain;

import static org.assertj.core.api.AssertionsForClassTypes.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.generator.project.domain.ProjectFilesAsserter.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.client.svelte.core.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.generator.project.domain.ProjectFilesAsserter.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.client.tools.cypress.domain;

import static org.assertj.core.api.AssertionsForClassTypes.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.generator.project.domain.ProjectFilesAsserter.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package tech.jhipster.lite.generator.project.infrastructure.primary.rest;

import static org.hamcrest.Matchers.matchesRegex;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.test.web.servlet.MockMvc;
import tech.jhipster.lite.IntegrationTest;

@IntegrationTest
@AutoConfigureMockMvc
class ProjectFoldersResourceIT {

@Autowired
private MockMvc mockMvc;

@Test
void shouldGetProject() throws Exception {
mockMvc.perform(get("/api/project-folders")).andExpect(content().string(matchesRegex("^.*/.{36}$")));
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.project.infrastructure.secondary;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.common.domain.FileUtils.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tech.jhipster.lite.generator.server.javatool.frontendmaven.domain;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tech.jhipster.lite.generator.server.springboot.broker.kafka.domain;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tech.jhipster.lite.generator.server.springboot.broker.pulsar.domain;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.core.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tech.jhipster.lite.generator.server.springboot.database.mongodb.domain;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.database.mssql.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.database.sqlcommon.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.dbmigration.flyway.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;
import static tech.jhipster.lite.generator.project.domain.ProjectFilesAsserter.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.mvc.security.jwt.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.mvc.web.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.TestUtils.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.server.springboot.webflux.web.domain;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;

import java.util.HashMap;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.history.infrastructure.primary;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.history.infrastructure.primary.dto.HistoryDTOTest.*;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.history.infrastructure.secondary;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static tech.jhipster.lite.history.domain.HistoryProjectsFixture.*;

Expand Down
Loading

0 comments on commit 869362f

Please sign in to comment.