Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Forced project folder #2449

Merged
merged 2 commits into from
Jul 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -6,7 +6,6 @@
import tech.jhipster.lite.error.domain.Assert;
import tech.jhipster.lite.module.domain.JHipsterDestination;
import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder;
import tech.jhipster.lite.module.domain.JHipsterSource;
import tech.jhipster.lite.module.domain.javabuildplugin.JavaBuildPlugin;
import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import tech.jhipster.lite.error.domain.Assert;
import tech.jhipster.lite.module.domain.JHipsterDestination;
import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder;
import tech.jhipster.lite.module.domain.JHipsterSource;
import tech.jhipster.lite.module.domain.javadependency.JavaDependency;
import tech.jhipster.lite.module.domain.javadependency.JavaDependencyScope;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import tech.jhipster.lite.generator.server.springboot.common.domain.Level;
import tech.jhipster.lite.module.domain.DocumentationTitle;
import tech.jhipster.lite.module.domain.JHipsterDestination;
import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder;
import tech.jhipster.lite.module.domain.JHipsterSource;
import tech.jhipster.lite.module.domain.javadependency.JavaDependency;
import tech.jhipster.lite.module.domain.javadependency.JavaDependencyScope;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import tech.jhipster.lite.error.domain.Assert;
import tech.jhipster.lite.module.domain.JHipsterDestination;
import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder;
import tech.jhipster.lite.module.domain.JHipsterSource;
import tech.jhipster.lite.module.domain.javabuild.GroupId;
import tech.jhipster.lite.module.domain.javadependency.JavaDependency;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import tech.jhipster.lite.docker.domain.DockerImages;
import tech.jhipster.lite.error.domain.Assert;
import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder;
import tech.jhipster.lite.module.domain.JHipsterSource;
import tech.jhipster.lite.module.domain.javaproperties.JHipsterModuleSpringProperties.JHipsterModuleSpringPropertiesBuilder;
import tech.jhipster.lite.module.domain.javaproperties.PropertyValue;
Expand Down
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,24 @@
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;

@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 (forcedProjectFolder != null && (!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) {}

get(): Promise<FolderName> {
return 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 {};
}
2 changes: 1 addition & 1 deletion src/test/java/tech/jhipster/lite/TestUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ public static <T> T readFileToObject(String path, Class<T> valueType) {
try {
return mapper.readValue(stringObject, valueType);
} catch (JsonProcessingException e) {
throw new AssertionError("Can't read value");
throw new AssertionError("Can't read value", e);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tech.jhipster.lite.generator.buildtool.generic.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.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.react.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.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
Expand Up @@ -14,7 +14,6 @@
import tech.jhipster.lite.module.domain.JHipsterModulesFixture;
import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties;
import tech.jhipster.lite.module.domain.properties.JHipsterProjectFolder;
import tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.ModuleAsserter;

@UnitTest
@ExtendWith(MockitoExtension.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package tech.jhipster.lite.generator.packagemanager.npm.infrastructure.primary.rest;

import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
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
Expand Up @@ -15,7 +15,6 @@
import tech.jhipster.lite.module.domain.JHipsterModule;
import tech.jhipster.lite.module.domain.JHipsterModulesFixture;
import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties;
import tech.jhipster.lite.module.infrastructure.secondary.JHipsterModulesAssertions.ModuleAsserter;

@UnitTest
@ExtendWith(MockitoExtension.class)
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
Loading