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

feat: Add endpoint and service for all data models #14668

Merged
merged 8 commits into from
Feb 17, 2025
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
44 changes: 40 additions & 4 deletions backend/src/Designer/Controllers/DatamodelsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,11 @@ public async Task<IActionResult> Delete(string org, string repository, [FromQuer
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status302Found)]
[Route("all-json")]
public ActionResult<IEnumerable<AltinnCoreFile>> GetDataModels(string org, string repository)
public ActionResult<IEnumerable<AltinnCoreFile>> GetAllJsonDataModels(string org, string repository)
{
var developer = AuthenticationHelper.GetDeveloperUserName(HttpContext);
var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, repository, developer);
var schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
var schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);

return Ok(schemaFiles);
}
Expand All @@ -139,11 +139,47 @@ public ActionResult<IEnumerable<AltinnCoreFile>> GetDataModels(string org, strin
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status302Found)]
[Route("all-xsd")]
public ActionResult<IEnumerable<AltinnCoreFile>> GetXSDDataModels(string org, string repository)
public ActionResult<IEnumerable<AltinnCoreFile>> GetAllXsdDataModels(string org, string repository)
{
string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext);
var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, repository, developer);
IList<AltinnCoreFile> schemaFiles = _schemaModelService.GetSchemaFiles(editingContext, true);
IList<AltinnCoreFile> schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext, true);

return Ok(schemaFiles);
}

/// <summary>
/// Method that returns all JSON schema data models within App/models.
/// </summary>
/// <param name="org">the org owning the models repo</param>
/// <param name="repository">the model repos</param>
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status302Found)]
[Route("app-json")]
public ActionResult<IEnumerable<AltinnCoreFile>> GetAppJsonDataModels(string org, string repository)
{
var developer = AuthenticationHelper.GetDeveloperUserName(HttpContext);
var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, repository, developer);
var schemaFiles = _schemaModelService.GetAppSchemaFiles(editingContext);

return Ok(schemaFiles);
}

/// <summary>
/// Method that returns all xsd models within App/models.
/// </summary>
/// <param name="org">the org owning the models repo</param>
/// <param name="repository">the model repos</param>
[HttpGet]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status302Found)]
[Route("app-xsd")]
public ActionResult<IEnumerable<AltinnCoreFile>> GetAppXsdDataModels(string org, string repository)
{
string developer = AuthenticationHelper.GetDeveloperUserName(HttpContext);
var editingContext = AltinnRepoEditingContext.FromOrgRepoDeveloper(org, repository, developer);
IList<AltinnCoreFile> schemaFiles = _schemaModelService.GetAppSchemaFiles(editingContext, true);

return Ok(schemaFiles);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -977,10 +977,23 @@ public List<string> GetAllImageFileNames()
return allFilePaths;
}

/// <summary>
/// Finds all schema files in repository.
/// </summary>
public IList<AltinnCoreFile> GetAllSchemaFiles(bool xsd = false)
{
string schemaFilesPattern = xsd ? SchemaFilePatternXsd : SchemaFilePatternJson;

var schemaFiles = FindFiles(new[] { schemaFilesPattern });
var altinnCoreSchemaFiles = MapFilesToAltinnCoreFiles(schemaFiles);

return altinnCoreSchemaFiles;
}

/// <summary>
/// Finds all schema files in App/models directory.
/// </summary>
public IList<AltinnCoreFile> GetSchemaFiles(bool xsd = false)
public IList<AltinnCoreFile> GetAppSchemaFiles(bool xsd = false)
{
string schemaFilesPattern = xsd ? SchemaFilePatternXsd : SchemaFilePatternJson;
string schemaFilesPath = Path.Combine(ModelFolderPath, schemaFilesPattern);
Expand Down
12 changes: 10 additions & 2 deletions backend/src/Designer/Services/Implementation/SchemaModelService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,19 @@ public SchemaModelService(
}

/// <inheritdoc/>
public IList<AltinnCoreFile> GetSchemaFiles(AltinnRepoEditingContext altinnRepoEditingContext, bool xsd = false)
public IList<AltinnCoreFile> GetAllSchemaFiles(AltinnRepoEditingContext altinnRepoEditingContext, bool xsd = false)
{
var altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository(altinnRepoEditingContext.Org, altinnRepoEditingContext.Repo, altinnRepoEditingContext.Developer);

return altinnAppGitRepository.GetSchemaFiles(xsd);
return altinnAppGitRepository.GetAllSchemaFiles(xsd);
}

/// <inheritdoc/>
public IList<AltinnCoreFile> GetAppSchemaFiles(AltinnRepoEditingContext altinnRepoEditingContext, bool xsd = false)
{
var altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository(altinnRepoEditingContext.Org, altinnRepoEditingContext.Repo, altinnRepoEditingContext.Developer);

return altinnAppGitRepository.GetAppSchemaFiles(xsd);
}

/// <inheritdoc/>
Expand Down
12 changes: 10 additions & 2 deletions backend/src/Designer/Services/Interfaces/ISchemaModelService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,20 @@ namespace Altinn.Studio.Designer.Services.Interfaces
public interface ISchemaModelService
{
/// <summary>
/// Gets a list of the schema files within the repository.
/// Gets a list of all the schema files within the repository.
/// </summary>
/// /// <param name="altinnRepoEditingContext">An <see cref="AltinnRepoEditingContext"/>.</param>
/// <param name="xsd">Value to indicate if schema files should be XSDs or not</param>
/// <returns>A total list of schema files within the repository, regardless of location.</returns>
IList<AltinnCoreFile> GetSchemaFiles(AltinnRepoEditingContext altinnRepoEditingContext, bool xsd = false);
IList<AltinnCoreFile> GetAllSchemaFiles(AltinnRepoEditingContext altinnRepoEditingContext, bool xsd = false);

/// <summary>
/// Gets a list of the schema files within App/models directory.
/// </summary>
/// <param name="altinnRepoEditingContext">An <see cref="AltinnRepoEditingContext"/>.</param>
/// <param name="xsd">Value to indicate if schema files should be XSDs or not</param>
/// <returns>A list of schema files within the App/models directory.</returns>
IList<AltinnCoreFile> GetAppSchemaFiles(AltinnRepoEditingContext altinnRepoEditingContext, bool xsd = false);

/// <summary>
/// Gets the JSON content of the specified schema file.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -389,19 +389,19 @@ public async Task CreateOrOverwriteOptions_WithAppThatHasOptionLists_ShouldOverw
[InlineData("ttd", "apps-test", "testUser", 0)]
[InlineData("ttd", "ttd-datamodels", "testUser", 0)]
[InlineData("ttd", "hvem-er-hvem", "testUser", 7)]
public async Task GetSchemaFiles_FilesExist_ShouldReturnFiles(string org, string repository, string developer, int expectedSchemaFiles)
public async Task GetAllSchemaFiles_FilesExist_ShouldReturnFiles(string org, string repository, string developer, int expectedSchemaFiles)
{
string targetRepository = TestDataHelper.GenerateTestRepoName();
await TestDataHelper.CopyRepositoryForTest(org, repository, developer, targetRepository);
AltinnAppGitRepository altinnAppGitRepository = PrepareRepositoryForTest(org, targetRepository, developer);

var files = altinnAppGitRepository.GetSchemaFiles();
var files = altinnAppGitRepository.GetAllSchemaFiles();

Assert.Equal(expectedSchemaFiles, files.Count);
}

[Fact]
public async Task GetSchemaFiles_FilesExist_ShouldReturnFilesWithCorrectProperties()
public async Task GetAllSchemaFiles_FilesExist_ShouldReturnFilesWithCorrectProperties()
{
string org = "ttd";
string repository = "hvem-er-hvem";
Expand All @@ -411,14 +411,14 @@ public async Task GetSchemaFiles_FilesExist_ShouldReturnFilesWithCorrectProperti
await TestDataHelper.CopyRepositoryForTest(org, repository, developer, targetRepository);
AltinnAppGitRepository altinnAppGitRepository = PrepareRepositoryForTest(org, targetRepository, developer);

var file = altinnAppGitRepository.GetSchemaFiles().First(f => f.FileName == "HvemErHvem_ExternalTypes.schema.json");
var file = altinnAppGitRepository.GetAllSchemaFiles().First(f => f.FileName == "HvemErHvem_ExternalTypes.schema.json");

Assert.Equal(".json", file.FileType);
Assert.Equal(@"/App/models/HvemErHvem_ExternalTypes.schema.json", file.RepositoryRelativeUrl);
}

[Fact]
public async Task GetSchemaFiles_FilesExistOutsideModelsFolder_ShouldNotReturnFiles()
public async Task GetAllSchemaFiles_FilesExistOutsideModelsFolder_ShouldReturnFiles()
{
string org = "ttd";
string repository = "app-with-misplaced-datamodels";
Expand All @@ -428,7 +428,55 @@ public async Task GetSchemaFiles_FilesExistOutsideModelsFolder_ShouldNotReturnFi
await TestDataHelper.CopyRepositoryForTest(org, repository, developer, targetRepository);
AltinnAppGitRepository altinnAppGitRepository = PrepareRepositoryForTest(org, targetRepository, developer);

var files = altinnAppGitRepository.GetSchemaFiles();
var files = altinnAppGitRepository.GetAllSchemaFiles();

Assert.Single(files);
}

[Theory]
[InlineData("ttd", "apps-test", "testUser", 0)]
[InlineData("ttd", "ttd-datamodels", "testUser", 0)]
[InlineData("ttd", "hvem-er-hvem", "testUser", 7)]
public async Task GetAppSchemaFiles_FilesExist_ShouldReturnFiles(string org, string repository, string developer, int expectedSchemaFiles)
{
string targetRepository = TestDataHelper.GenerateTestRepoName();
await TestDataHelper.CopyRepositoryForTest(org, repository, developer, targetRepository);
AltinnAppGitRepository altinnAppGitRepository = PrepareRepositoryForTest(org, targetRepository, developer);

var files = altinnAppGitRepository.GetAppSchemaFiles();

Assert.Equal(expectedSchemaFiles, files.Count);
}

[Fact]
public async Task GetAppSchemaFiles_FilesExist_ShouldReturnFilesWithCorrectProperties()
{
string org = "ttd";
string repository = "hvem-er-hvem";
string developer = "testUser";
string targetRepository = TestDataHelper.GenerateTestRepoName();

await TestDataHelper.CopyRepositoryForTest(org, repository, developer, targetRepository);
AltinnAppGitRepository altinnAppGitRepository = PrepareRepositoryForTest(org, targetRepository, developer);

var file = altinnAppGitRepository.GetAppSchemaFiles().First(f => f.FileName == "HvemErHvem_ExternalTypes.schema.json");

Assert.Equal(".json", file.FileType);
Assert.Equal(@"/App/models/HvemErHvem_ExternalTypes.schema.json", file.RepositoryRelativeUrl);
}

[Fact]
public async Task GetAppSchemaFiles_FilesExistOutsideModelsFolder_ShouldNotReturnFiles()
{
string org = "ttd";
string repository = "app-with-misplaced-datamodels";
string developer = "testUser";
string targetRepository = TestDataHelper.GenerateTestRepoName();

await TestDataHelper.CopyRepositoryForTest(org, repository, developer, targetRepository);
AltinnAppGitRepository altinnAppGitRepository = PrepareRepositoryForTest(org, targetRepository, developer);

var files = altinnAppGitRepository.GetAppSchemaFiles();

Assert.Empty(files);
}
Expand Down
12 changes: 6 additions & 6 deletions backend/tests/Designer.Tests/Services/SchemaModelServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public async Task DeleteSchema_AppRepo_ShouldDelete()
await TestDataHelper.CopyRepositoryForTest(org, sourceRepository, developer, targetRepository);
try
{
var schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
var schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);
Assert.Equal(7, schemaFiles.Count);

var altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository(org, targetRepository, developer);
Expand All @@ -57,7 +57,7 @@ public async Task DeleteSchema_AppRepo_ShouldDelete()
await _schemaModelService.DeleteSchema(editingContext, schemaToDelete.RepositoryRelativeUrl);

// Assert
schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);
Assert.Equal(6, schemaFiles.Count);
applicationMetadata = await altinnAppGitRepository.GetApplicationMetadata();
Assert.Single(applicationMetadata.DataTypes);
Expand All @@ -83,7 +83,7 @@ public async Task DeleteSchema_AppRepoWithLayoutSets_ShouldDelete()
{
string dataModelName = "datamodel";

var schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
var schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);
Assert.Single(schemaFiles);

var altinnAppGitRepository = _altinnGitRepositoryFactory.GetAltinnAppGitRepository(org, targetRepository, developer);
Expand All @@ -95,7 +95,7 @@ public async Task DeleteSchema_AppRepoWithLayoutSets_ShouldDelete()
await _schemaModelService.DeleteSchema(editingContext, schemaToDelete.RepositoryRelativeUrl);

// Assert
schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);
Assert.Empty(schemaFiles);
var applicationMetadataAfter = await altinnAppGitRepository.GetApplicationMetadata();
Assert.Equal(applicationMetadataBefore.DataTypes.Count - 1, applicationMetadataAfter.DataTypes.Count);
Expand Down Expand Up @@ -124,15 +124,15 @@ public async Task DeleteSchema_ModelsRepo_ShouldDelete()
try
{

var schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
var schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);
Assert.Equal(7, schemaFiles.Count);

// Act
var schemaToDelete = schemaFiles.First(s => s.FileName == "Kursdomene_HvemErHvem_M_2021-04-08_5742_34627_SERES.schema.json");
await _schemaModelService.DeleteSchema(editingContext, schemaToDelete.RepositoryRelativeUrl);

// Assert
schemaFiles = _schemaModelService.GetSchemaFiles(editingContext);
schemaFiles = _schemaModelService.GetAllSchemaFiles(editingContext);
Assert.Equal(6, schemaFiles.Count);
}
finally
Expand Down
6 changes: 4 additions & 2 deletions frontend/packages/shared/src/api/paths.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,10 @@ export const dataModelPath = (org, app, modelPath, saveOnly = false) =>
saveOnly,
})}`; // Get, Put, Delete
export const dataTypePath = (org, app, dataModelName) => `${basePath}/${org}/${app}/datamodels/datamodel/${dataModelName}/dataType`; // Get, Put
export const dataModelsPath = (org, app) => `${basePath}/${org}/${app}/datamodels/all-json`; // Get
export const dataModelsXsdPath = (org, app) => `${basePath}/${org}/${app}/datamodels/all-xsd`; // Get
export const dataModelsAllJsonPath = (org, app) => `${basePath}/${org}/${app}/datamodels/all-json`; // Get
export const dataModelsAllXsdPath = (org, app) => `${basePath}/${org}/${app}/datamodels/all-xsd`; // Get
export const dataModelsAppJsonPath = (org, app) => `${basePath}/${org}/${app}/datamodels/app-json`; // Get
export const dataModelsAppXsdPath = (org, app) => `${basePath}/${org}/${app}/datamodels/app-xsd`; // Get
export const dataModelsUploadPath = (org, app) => `${basePath}/${org}/${app}/datamodels/upload`; // Post
export const dataModelAddXsdFromRepoPath = (org, app, filePath) => `${basePath}/${org}/${app}/datamodels/xsd-from-repo?${s({ filePath })}`; // Post

Expand Down
8 changes: 4 additions & 4 deletions frontend/packages/shared/src/api/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import {
branchStatusPath,
dataModelMetadataPath,
dataModelPath,
dataModelsPath,
dataModelsXsdPath,
dataModelsAppJsonPath,
dataModelsAppXsdPath,
deployPermissionsPath,
deploymentsPath,
envConfigPath,
Expand Down Expand Up @@ -110,8 +110,8 @@ export const getAppVersion = (org: string, app: string) => get<AppVersion>(appVe
export const getBranchStatus = (owner: string, app: string, branch: string) => get<BranchStatus>(branchStatusPath(owner, app, branch));
export const getDataModel = (owner: string, app: string, modelPath: string) => get<JsonSchema>(dataModelPath(owner, app, modelPath));
export const getDataModelMetadata = (owner: string, app: string, layoutSetName: string, dataModelName: string) => get<DataModelMetadataResponse>(dataModelMetadataPath(owner, app, layoutSetName, dataModelName));
export const getDataModelsJson = (owner: string, app: string) => get<DataModelMetadataJson[]>(dataModelsPath(owner, app));
export const getDataModelsXsd = (owner: string, app: string) => get<DataModelMetadataXsd[]>(dataModelsXsdPath(owner, app));
export const getDataModelsJson = (owner: string, app: string) => get<DataModelMetadataJson[]>(dataModelsAppJsonPath(owner, app));
export const getDataModelsXsd = (owner: string, app: string) => get<DataModelMetadataXsd[]>(dataModelsAppXsdPath(owner, app));
export const getDataType = (org: string, app: string, dataModelName: string) => get<DataType>(dataTypePath(org, app, dataModelName));
export const getDeployPermissions = (owner: string, app: string) => get<string[]>(deployPermissionsPath(owner, app));
export const getDeployments = (owner: string, app: string) => get<DeploymentsResponse>(deploymentsPath(owner, app, 'Descending'));
Expand Down