Skip to content
Snippets Groups Projects
Commit 43feb825 authored by Benedikt Heinrichs's avatar Benedikt Heinrichs
Browse files

Merge branch 'Topic/157-userProfileApi' into 'Product/118-migrationForProjectAPI'

Topic/157 user profile api

See merge request coscine/api/project!2
parents 60707448 19c22553
No related branches found
No related tags found
2 merge requests!4Product/118 migration for project api,!2Topic/157 user profile api
Showing
with 794 additions and 620 deletions
......@@ -10,6 +10,9 @@
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Database connection for t4 class generation from database
**/*.generated.cs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
......@@ -262,5 +265,6 @@ __pycache__/
*.pyc
#cake
tools/
tools/*
!tools/packages.config
dist/
stages:
- build
- test
......@@ -10,12 +8,11 @@ stages:
- release
build:
before_script:
- PowerShell .\build.ps1 -Target Clean
- PowerShell .\build.ps1 -Target Restore-NuGet-Packages
stage: build
script:
- PowerShell .\build.ps1 -Target Build
- PowerShell .\build.ps1 -Target Build -Configuration Debug
variables:
GIT_STRATEGY: clone
except:
variables:
- $GITLAB_USER_ID == $GIT_BOT_USER_ID
......@@ -23,15 +20,16 @@ build:
test:
stage: test
script:
- PowerShell .\build.ps1 -Target Resharper
- PowerShell .\build.ps1 -Target Run-Unit-Tests
- PowerShell .\build.ps1 -Target LinterAndTest -Configuration Debug
variables:
GIT_STRATEGY: none
dependencies:
- build
artifacts:
reports:
junit: TestResult.xml
junit: "./Artifacts/TestResults.xml"
paths:
- "./Artifacts/*"
except:
variables:
- $GITLAB_USER_ID == $GIT_BOT_USER_ID
......@@ -39,7 +37,7 @@ test:
update-assembly-info:
stage: update-assembly-info
script:
- PowerShell .\build.ps1 -Target Update-Assembly-Info
- PowerShell .\build.ps1 -Target UpdateAssemblyInfo
variables:
GIT_STRATEGY: none
dependencies:
......@@ -51,12 +49,10 @@ update-assembly-info:
- $GITLAB_USER_ID == $GIT_BOT_USER_ID
build-release:
before_script:
- PowerShell .\build.ps1 -Target Clean
- PowerShell .\build.ps1 -Target Restore-NuGet-Packages
stage: build-release
script:
- PowerShell .\build.ps1 -Target Build-Release
- PowerShell .\build.ps1 -Target Build -Configuration Release
- PowerShell .\build.ps1 -Configuration Release -Target NugetPack
variables:
GIT_STRATEGY: none
dependencies:
......@@ -84,7 +80,7 @@ docs:
semantic-release:
stage: semantic-release
script:
- PowerShell .\build.ps1 -Target Semantic-Release
- PowerShell .\build.ps1 -Target SemanticRelease
variables:
GIT_STRATEGY: none
dependencies:
......@@ -96,13 +92,16 @@ semantic-release:
- $GITLAB_USER_ID == $GIT_BOT_USER_ID
release:
before_script:
stage: release
script:
- PowerShell .\build.ps1 -Target Build-Release
- PowerShell .\build.ps1 -Target Build -Configuration Release
- PowerShell .\build.ps1 -Configuration Release -Target NugetPack
- PowerShell .\build.ps1 -Configuration Release -Target NugetPush --nugetApiKey="$NUGET_API_KEY"
variables:
GIT_STRATEGY: none
GIT_STRATEGY: clone
artifacts:
paths:
- dist
- "./Artifacts/*"
only:
- tags
#tool nuget:?package=NUnit.ConsoleRunner&version=3.9.0
#tool nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2018.3.4
#tool nuget:?package=vswhere&version=2.6.7
#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Npx&version=1.3.0
#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Issues&version=0.6.2
#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.Issues.InspectCode&version=0.6.1
#addin nuget:https://api.nuget.org/v3/index.json?package=Cake.FileHelpers&version=3.1.0
//////////////////////////////////////////////////////////////////////
// ARGUMENTS
//////////////////////////////////////////////////////////////////////
var target = Argument("target", "Default");
var configuration = Argument("configuration", "Release");
var nugetApiKey = Argument<string>("nugetApiKey", null);
//////////////////////////////////////////////////////////////////////
// PREPARATION
//////////////////////////////////////////////////////////////////////
// Define directories.
string projectName;
string projectPath;
DirectoryPath buildDir;
FilePath solutionFile;
var projects = GetFiles("./**/*.csproj");
var artifactsDir = Directory("./Artifacts");
string nupkgDir;
var solutionFile = GetFiles("./**/*.sln").First();
var projectName = solutionFile.GetFilenameWithoutExtension().ToString();
var assemblyInfoSubPath = "Properties/AssemblyInfo.cs";
var nugetSource = "https://api.nuget.org/v3/index.json";
// get latest MSBuild version
var vsLatest = VSWhereLatest();
var msBuildPathX64 = (vsLatest == null) ? null : vsLatest.CombineWithFilePath("./MSBuild/Current/Bin/MSBuild.exe");
// Error rules for resharper
// Example: {"InconsistentNaming", "RedundantUsingDirective"};
string[] resharperErrorRules = {};
// Paths to exclude from dupFinder
List<string> dupFinderExcludePatterns = projects.Select( x => $"{x.GetDirectory().ToString()}/{assemblyInfoSubPath}").ToList();
string[] dupFinderExcludeCodeRegionsByNameSubstring = { "DupFinder Exclusion" };
Action<NpxSettings> requiredSemanticVersionPackages = settings => settings
.AddPackage("semantic-release")
Action <NpxSettings> requiredSemanticVersionPackages = settings =>
settings.AddPackage("semantic-release")
.AddPackage("@semantic-release/commit-analyzer")
.AddPackage("@semantic-release/release-notes-generator")
.AddPackage("@semantic-release/gitlab")
......@@ -36,81 +45,147 @@ Action<NpxSettings> requiredSemanticVersionPackages = settings => settings
.AddPackage("@semantic-release/exec")
.AddPackage("conventional-changelog-eslint");
///////////////////////////////////////////////////////////////////////////////
// SETUP / TEARDOWN
///////////////////////////////////////////////////////////////////////////////
Setup(context =>{
nupkgDir = $"{artifactsDir.ToString()}/nupkg";
Information("Running tasks...");
});
Teardown(context =>{
Information("Finished running tasks.");
});
//////////////////////////////////////////////////////////////////////
// TASKS
//////////////////////////////////////////////////////////////////////
Task("Clean")
.Description("Cleans all build and artifacts directories")
.Does(() =>{
var settings = new DeleteDirectorySettings {
Recursive = true,
Force = true
};
var directoriesToDelete = new List<DirectoryPath>();
foreach(var project in projects) {
directoriesToDelete.Add(Directory($"{project.GetDirectory()}/obj"));
directoriesToDelete.Add(Directory($"{project.GetDirectory()}/bin"));
}
Task("Get-Project-Name")
.Does(() =>
{
var solutions = GetFiles("./**/*.sln");
projectName = solutions.First().GetFilenameWithoutExtension().ToString();
Information("Project Name: {0}", projectName);
solutionFile = solutions.First().ToString();
Information("Solution File: {0}", solutionFile.ToString());
projectPath = Context.Environment.WorkingDirectory.ToString().ToString() + "/src";
Information("Project Directory: {0}", projectPath);
directoriesToDelete.Add(artifactsDir);
buildDir = Directory(projectPath + "/" + projectName + "/bin") + Directory(configuration);
Information("Build Directory: {0}", buildDir.ToString());
foreach(var dir in directoriesToDelete) {
if (DirectoryExists(dir)) {
Information($"Cleaning path {dir} ...");
DeleteDirectory(dir, settings);
}
}
});
Task("Clean")
.IsDependentOn("Get-Project-Name")
.Does(() =>
{
CleanDirectory(buildDir);
CleanDirectory("./dist");
Task("Restore")
.Does(() =>{
// Restore all NuGet packages.
Information($"Restoring {solutionFile}...");
NuGetRestore(solutionFile, new NuGetRestoreSettings {
NoCache = true
});
Task("Restore-NuGet-Packages")
.IsDependentOn("Get-Project-Name")
.Does(() =>
{
NuGetRestore(solutionFile);
});
Task("Resharper")
.IsDependentOn("Get-Project-Name")
.Does(() =>
{
FilePath dupLog = Context.Environment.WorkingDirectory + "/Resharper/dupfinder.xml";
FilePath inspectLog = Context.Environment.WorkingDirectory + "/Resharper/inspectcode.xml";
DupFinder(solutionFile, new DupFinderSettings() {
OutputFile = dupLog.ToString()
Task("DupFinder")
.Description("Find duplicates in the code")
.Does(() =>{
var settings = new DupFinderSettings() {
ShowStats = true,
ShowText = true,
OutputFile = $"{artifactsDir}/dupfinder.xml",
ExcludeCodeRegionsByNameSubstring = dupFinderExcludeCodeRegionsByNameSubstring,
ExcludePattern = dupFinderExcludePatterns.ToArray(),
ThrowExceptionOnFindingDuplicates = true
};
DupFinder(solutionFile, settings);
});
Information("DupFinder Log:{0}{1}", Environment.NewLine, FileReadText(dupLog));
InspectCode(solutionFile, new InspectCodeSettings() {
OutputFile = inspectLog.ToString()
});
Task("InspectCode")
.Description("Inspect the code using Resharper's rule set")
.Does(() =>{
var settings = new InspectCodeSettings() {
SolutionWideAnalysis = true,
OutputFile = $"{artifactsDir}/inspectcode.xml",
ThrowExceptionOnFindingViolations = false
};
InspectCode(solutionFile, settings);
var issues = ReadIssues(
InspectCodeIssuesFromFilePath(inspectLog.ToString()),
Context.Environment.WorkingDirectory);
InspectCodeIssuesFromFilePath($"{artifactsDir}/inspectcode.xml"), Context.Environment.WorkingDirectory);
Information("{0} issues are found.", issues.Count());
Information("InspectCode Log:{0}{1}", Environment.NewLine, FileReadText(inspectLog));
var errorIssues = issues.Where(issue =>resharperErrorRules.Any(issue.Rule.Contains)).ToList();
if(errorIssues.Any())
{
if (errorIssues.Any()) {
var errorMessage = errorIssues.Aggregate(new StringBuilder(), (stringBuilder, issue) =>stringBuilder.AppendFormat("FileName: {0} Line: {1} Message: {2}{3}", issue.AffectedFileRelativePath, issue.Line, issue.Message, Environment.NewLine));
throw new CakeException($"{errorIssues.Count} errors detected: {Environment.NewLine}{errorMessage}.");
}
});
Task("Update-Assembly-Info")
.IsDependentOn("Get-Project-Name")
.Does(() =>
Task("Test")
.Does(() =>{
NUnit3($"./src/**/bin/{configuration}/*.Tests.dll", new NUnit3Settings {
// generate the xml file
NoResults = false,
Results = new NUnit3Result[] {
new NUnit3Result() {
FileName = $"{artifactsDir}/TestResults.xml",
Transform = Context.Environment.WorkingDirectory + "/nunit3-junit.xslt"
}
}
});
});
Task("NugetPush")
.Does(() =>{
var nupkgs = GetFiles($"{nupkgDir}/*.nupkg");
Information("Need to push {0} packages", nupkgs.Count);
foreach(var nupkg in nupkgs) {
Information("Pushing {0}", nupkg);
NuGetPush(nupkg, new NuGetPushSettings {
Source = nugetSource,
ApiKey = nugetApiKey
});
}
});
Task("NugetPack")
.Does(() =>{
foreach(var project in projects) {
var nuspec = $"{project.GetDirectory()}/{project.GetFilenameWithoutExtension()}.nuspec";
if(!project.ToString().EndsWith(".Tests")
&& FileExists(nuspec))
{
Information("Packing {0}...", nuspec);
if(!DirectoryExists(nupkgDir)) {
CreateDirectory(nupkgDir);
}
NuGetPack(project.ToString() ,new NuGetPackSettings
{
OutputDirectory = nupkgDir,
Properties = new Dictionary<string, string> { {"Configuration", "Release"}}
});
}
}
});
Task("UpdateAssemblyInfo")
.Does(() =>{
Information("Running semantic-release in dry run mode to extract next semantic version number");
string[] semanticReleaseOutput;
......@@ -127,115 +202,106 @@ Task("Update-Assembly-Info")
var assemblyVersion = $"{nextSemanticVersionNumber}.0";
CreateAssemblyInfo(projectPath + "/" + projectName + "/Properties/AssemblyInfo.cs", new AssemblyInfoSettings{
Product = projectName,
Title = projectName,
Company = "RWTH Aachen University IT Center",
foreach(var project in projects) {
CreateAssemblyInfo($"{project.GetDirectory()}/{assemblyInfoSubPath}", new AssemblyInfoSettings {
Product = project.GetFilenameWithoutExtension().ToString(),
Title = project.GetFilenameWithoutExtension().ToString(),
Company = "IT Center, RWTH Aachen University",
Version = assemblyVersion,
FileVersion = assemblyVersion,
InformationalVersion = assemblyVersion,
Copyright = "RWTH Aachen University IT Center " + DateTime.Now.Year
Copyright = $"{DateTime.Now.Year} IT Center, RWTH Aachen University",
Description = $"{project.GetFilenameWithoutExtension().ToString()} is a part of the CoScInE group."
});
}
}
});
Task("Build-Release")
.IsDependentOn("Get-Project-Name")
.Does(() =>
{
if(IsRunningOnWindows())
{
Task("Build")
.IsDependentOn("Clean")
.IsDependentOn("Restore")
.Does(() =>{
if (IsRunningOnWindows()) {
var frameworkSettingsWindows = new MSBuildSettings {
Configuration = configuration,
Restore = true
};
frameworkSettingsWindows.ToolPath = msBuildPathX64;
frameworkSettingsWindows.WorkingDirectory = Context.Environment.WorkingDirectory;
if (configuration.Equals("Release")) {
frameworkSettingsWindows.WithProperty("DebugSymbols", "false");
frameworkSettingsWindows.WithProperty("DebugType", "None");
}
// Use MSBuild
MSBuild(solutionFile, settings =>
{
settings.SetConfiguration(configuration);
settings.WithProperty("DebugSymbols", "false");
settings.WithProperty("DebugType", "None");
});
Information($"Building {solutionFile}");
MSBuild(solutionFile, frameworkSettingsWindows);
}
else {
var frameworkSettingsUnix = new XBuildSettings {
Configuration = configuration
};
if (configuration.Equals("Release")) {
frameworkSettingsUnix.WithProperty("DebugSymbols", "false");
frameworkSettingsUnix.WithProperty("DebugType", "None");
}
else
{
// Use XBuild
XBuild(solutionFile, settings =>
{
settings.SetConfiguration(configuration);
settings.WithProperty("DebugSymbols", "false");
settings.WithProperty("DebugType", "None");
});
Information($"Building {solutionFile}");
XBuild(solutionFile, frameworkSettingsUnix);
}
CopyDirectory(buildDir, "./dist");
});
Task("Build")
.IsDependentOn("Get-Project-Name")
.Does(() =>
{
if(IsRunningOnWindows())
{
// Use MSBuild
MSBuild(solutionFile, settings =>
{
settings.SetConfiguration(configuration);
settings.WithProperty("RunCodeAnalysis", "true");
});
if (configuration.Equals("Release")) {
if(!DirectoryExists(artifactsDir)) {
CreateDirectory(artifactsDir);
}
else
{
// Use XBuild
XBuild(solutionFile, settings =>
foreach(var project in projects) {
if(!project.GetDirectory().ToString().EndsWith(".Tests")
&& !FileExists($"{project.GetDirectory()}/{project.GetFilenameWithoutExtension()}.nuspec"))
{
settings.SetConfiguration(configuration);
settings.WithProperty("RunCodeAnalysis", "true");
});
Information($"Copying {project.GetDirectory()}/bin/{configuration}/* to {artifactsDir}");
CopyDirectory($"{project.GetDirectory()}/bin/{configuration}/", artifactsDir);
}
}
}
});
Task("Run-Unit-Tests")
.Does(() =>
{
NUnit3("./src/**/bin/" + configuration + "/*.Tests.dll", new NUnit3Settings {
// generate the xml file
NoResults = false,
Results = new NUnit3Result[]{new NUnit3Result(){
FileName = Context.Environment.WorkingDirectory + "/TestResult.xml",
Transform = Context.Environment.WorkingDirectory + "/nunit3-junit.xslt"
}}
});
});
Task("Semantic-Release")
.Does(() =>
{
Task("SemanticRelease")
.Does(() =>{
Npx("semantic-release", requiredSemanticVersionPackages);
});
//////////////////////////////////////////////////////////////////////
// TASK TARGETS
//////////////////////////////////////////////////////////////////////
Task("Linter")
.Description("Run DupFinder and InspectCode")
.IsDependentOn("DupFinder")
.IsDependentOn("InspectCode");
Task("LinterAndTest")
.Description("Run Linter and Tests")
.IsDependentOn("Linter")
.IsDependentOn("Test");
Task("Default")
.IsDependentOn("Clean")
.IsDependentOn("Restore-NuGet-Packages")
.IsDependentOn("Resharper")
.IsDependentOn("Restore")
.IsDependentOn("DupFinder")
.IsDependentOn("InspectCode")
.IsDependentOn("Build")
.IsDependentOn("Run-Unit-Tests");
.IsDependentOn("Test");
//////////////////////////////////////////////////////////////////////
// EXECUTION
//////////////////////////////////////////////////////////////////////
RunTarget(target);
///////////////////////////////////////////////////////////////////////////////
// Helpers
///////////////////////////////////////////////////////////////////////////////
string ExtractNextSemanticVersionNumber(string[] semanticReleaseOutput)
{
string ExtractNextSemanticVersionNumber(string[] semanticReleaseOutput) {
var extractRegEx = new System.Text.RegularExpressions.Regex("^.+next release version is (?<SemanticVersionNumber>.*)$");
return semanticReleaseOutput
.Select(line => extractRegEx.Match(line).Groups["SemanticVersionNumber"].Value)
.Where(line => !string.IsNullOrWhiteSpace(line))
.SingleOrDefault();
return semanticReleaseOutput.Select(line =>extractRegEx.Match(line).Groups["SemanticVersionNumber"].Value).Where(line =>!string.IsNullOrWhiteSpace(line)).SingleOrDefault();
}
using Coscine.Api.Project.Models;
using Coscine.ApiCommons.Utils;
using Coscine.Database.Model;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
......@@ -17,15 +18,15 @@ namespace Coscine.Api.Project.Tests
{
protected T Controller { get; }
protected List<Coscine.Database.Model.Project> projects = new List<Coscine.Database.Model.Project>();
protected List<User> users = new List<User>();
protected List<ProjectRole> projectRoles = new List<ProjectRole>();
protected List<ResourceType> resourceTypes = new List<ResourceType>();
protected List<Resource> resources = new List<Resource>();
protected readonly List<Coscine.Database.Model.Project> Projects = new List<Coscine.Database.Model.Project>();
protected readonly List<User> Users = new List<User>();
protected readonly List<ProjectRole> ProjectRoles = new List<ProjectRole>();
protected readonly List<ResourceType> ResourceTypes = new List<ResourceType>();
protected readonly List<Resource> Resources = new List<Resource>();
protected int previous;
protected int Previous;
public DefaultControllerTests(T controller)
protected DefaultControllerTests(T controller)
{
Controller = controller;
}
......@@ -34,14 +35,18 @@ namespace Coscine.Api.Project.Tests
public void Setup()
{
ProjectModel projectModel = new ProjectModel();
previous = projectModel.GetAll().ToArray().Length;
Previous = projectModel.GetAll().ToArray().Length;
UserModel userModel = new UserModel();
var user = new User();
var user = new User()
{
DisplayName = "TestUser",
EmailAddress = "testUser@test.com",
};
userModel.Insert(user);
users.Add(user);
Users.Add(user);
FakeControllerContext(user);
......@@ -57,9 +62,9 @@ namespace Coscine.Api.Project.Tests
projectModel.Insert(project);
var projectRole = projectModel.SetOwner(project, user);
projectRoles.Add(projectRole);
ProjectRoles.Add(projectRole);
projects.Add(projectModel.GetById(project.Id));
Projects.Add(projectModel.GetById(project.Id));
var project2 = new Coscine.Database.Model.Project()
{
......@@ -71,7 +76,7 @@ namespace Coscine.Api.Project.Tests
Keywords = "Test1;Test2"
};
projectModel.Insert(project2);
projects.Add(projectModel.GetById(project2.Id));
Projects.Add(projectModel.GetById(project2.Id));
ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
var resourceType = new ResourceType()
......@@ -79,7 +84,7 @@ namespace Coscine.Api.Project.Tests
DisplayName = "TestType"
};
resourceTypeModel.Insert(resourceType);
resourceTypes.Add(resourceType);
ResourceTypes.Add(resourceType);
ResourceModel resourceModel = new ResourceModel();
var resource = new Resource()
......@@ -91,7 +96,7 @@ namespace Coscine.Api.Project.Tests
};
resourceModel.Insert(resource);
projectModel.AddResource(project, resource);
resources.Add(resource);
Resources.Add(resource);
var resource2 = new Resource()
{
......@@ -102,7 +107,7 @@ namespace Coscine.Api.Project.Tests
};
resourceModel.Insert(resource2);
projectModel.AddResource(project2, resource2);
resources.Add(resource2);
Resources.Add(resource2);
}
......@@ -144,32 +149,32 @@ namespace Coscine.Api.Project.Tests
public void End()
{
ProjectRoleModel projectRoleModel = new ProjectRoleModel();
foreach (var projectRole in projectRoles)
foreach (var projectRole in ProjectRoles)
{
projectRoleModel.Delete(projectRole);
}
ProjectResourceModel projectResourceModel = new ProjectResourceModel();
foreach(var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ResourceId == resources[0].Id || projectResource.ResourceId == resources[1].Id))
foreach(var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ResourceId == Resources[0].Id || projectResource.ResourceId == Resources[1].Id))
{
projectResourceModel.Delete(projectResource);
}
ProjectModel projectModel = new ProjectModel();
foreach (var project in projects)
foreach (var project in Projects)
{
projectModel.Delete(project);
}
UserModel userModel = new UserModel();
foreach (var user in users)
foreach (var user in Users)
{
userModel.Delete(user);
}
ResourceModel resourceModel = new ResourceModel();
foreach (var resource in resources)
foreach (var resource in Resources)
{
resourceModel.Delete(resource);
}
ResourceTypeModel resourceTypeModel = new ResourceTypeModel();
foreach (var resourceType in resourceTypes)
foreach (var resourceType in ResourceTypes)
{
resourceTypeModel.Delete(resourceType);
}
......
This diff is collapsed.
......@@ -4,11 +4,12 @@ using Microsoft.AspNetCore.Mvc;
using Coscine.Api.Project.Models;
using System.Linq;
using Coscine.Api.Project.ReturnObjects;
using Coscine.Api.Project.Factories;
using System.IO;
using System;
using Coscine.Api.Project.Exceptions;
using Coscine.ApiCommons.Exceptions;
using Coscine.ApiCommons.Factories;
#region DupFinder Exclusion
namespace Coscine.Api.Project.Tests
{
[TestFixture]
......@@ -23,12 +24,12 @@ namespace Coscine.Api.Project.Tests
public void OwnsTest()
{
ProjectModel projectModel = new ProjectModel();
Assert.IsTrue(projectModel.OwnsProject(users[0], projects[0]));
Assert.IsFalse(projectModel.OwnsProject(users[0], projects[1]));
Assert.IsTrue(projectModel.OwnsProject(Users[0], Projects[0]));
Assert.IsFalse(projectModel.OwnsProject(Users[0], Projects[1]));
var all = projectModel.GetAllWhere((project) =>
(from projectRole in project.ProjectRolesProjectIdIds
where projectRole.User == users[0]
where projectRole.User == Users[0]
&& projectRole.Role.DisplayName == "Owner"
select projectRole).Any()
);
......@@ -45,7 +46,7 @@ namespace Coscine.Api.Project.Tests
[Test]
public void TestControllerGet()
{
var actionResult = Controller.Get(projects[0].Id.ToString());
var actionResult = Controller.Get(Projects[0].Id.ToString());
Assert.IsTrue(actionResult.GetType() == typeof(OkObjectResult));
OkObjectResult okObjectResult = (OkObjectResult)actionResult;
......@@ -53,30 +54,29 @@ namespace Coscine.Api.Project.Tests
ProjectObject projectObject = (ProjectObject)okObjectResult.Value;
Assert.IsTrue(projectObject.Id == projects[0].Id);
Assert.IsTrue(projectObject.Description == projects[0].Description);
Assert.IsTrue(projectObject.DisplayName == projects[0].DisplayName);
Assert.IsTrue(projectObject.Organization == projects[0].Organization);
Assert.IsTrue(projectObject.StartDate == projects[0].StartDate);
Assert.IsTrue(projectObject.EndDate == projects[0].EndDate);
Assert.IsTrue(projectObject.Keywords == projects[0].Keywords);
Assert.IsTrue(projectObject.Id == Projects[0].Id);
Assert.IsTrue(projectObject.Description == Projects[0].Description);
Assert.IsTrue(projectObject.DisplayName == Projects[0].DisplayName);
Assert.IsTrue(projectObject.Organization == Projects[0].Organization);
Assert.IsTrue(projectObject.StartDate == Projects[0].StartDate);
Assert.IsTrue(projectObject.EndDate == Projects[0].EndDate);
Assert.IsTrue(projectObject.Keywords == Projects[0].Keywords);
}
[Test]
public void TestControllerUpdate()
{
var actionResult = Controller.Get(projects[0].Id.ToString());
OkObjectResult okObjectResult = (OkObjectResult)actionResult;;
ProjectObject projectObject = (ProjectObject)okObjectResult.Value;
var actionResult = Controller.Get(Projects[0].Id.ToString());
ProjectObject projectObject = (ProjectObject)((OkObjectResult)actionResult).Value;
projectObject.Description = "ChangedDescription";
Stream stream = ObjectFactory<ProjectObject>.SerializeToStream(projectObject);
FakeControllerContext(users[0], stream);
FakeControllerContext(Users[0], stream);
actionResult = Controller.Update(projects[0].Id.ToString());
actionResult = Controller.Update(Projects[0].Id.ToString());
Assert.IsTrue(actionResult.GetType() == typeof(OkObjectResult));
// Cleanup
......@@ -84,11 +84,11 @@ namespace Coscine.Api.Project.Tests
stream = ObjectFactory<ProjectObject>.SerializeToStream(projectObject);
FakeControllerContext(users[0], stream);
FakeControllerContext(Users[0], stream);
try
{
actionResult = Controller.Update(projects[1].Id.ToString());
Controller.Update(Projects[1].Id.ToString());
Assert.Fail();
}
catch (Exception e)
......@@ -103,11 +103,11 @@ namespace Coscine.Api.Project.Tests
[Test]
public void TestControllerStore()
{
ProjectObject newProjectObject = new ProjectObject(System.Guid.NewGuid(), "NewProject", "NewDisplayName", "NewOrganisation", DateTime.Now, DateTime.Now.AddYears(1), "test2;test3");
ProjectObject newProjectObject = new ProjectObject(Guid.NewGuid(), "NewProject", "NewDisplayName", "NewOrganisation", DateTime.Now, DateTime.Now.AddYears(1), "test2;test3");
var stream = ObjectFactory<ProjectObject>.SerializeToStream(newProjectObject);
FakeControllerContext(users[0], stream);
FakeControllerContext(Users[0], stream);
var actionResult = Controller.Store();
Assert.IsTrue(actionResult.GetType() == typeof(OkObjectResult));
......@@ -142,7 +142,8 @@ namespace Coscine.Api.Project.Tests
public void CountTest()
{
ProjectModel projectModel = new ProjectModel();
Assert.IsTrue(previous == projectModel.GetAll().ToArray().Length - projects.Count);
Assert.IsTrue(Previous == projectModel.GetAll().ToArray().Length - Projects.Count);
}
}
}
#endregion
\ No newline at end of file
using Coscine.Api.Project.Controllers;
using Coscine.Api.Project.Exceptions;
using Coscine.Api.Project.Factories;
using Coscine.Api.Project.Models;
using Coscine.Api.Project.ReturnObjects;
using Coscine.ApiCommons.Exceptions;
using Coscine.ApiCommons.Factories;
using Microsoft.AspNetCore.Mvc;
using NUnit.Framework;
using System;
......@@ -27,7 +27,7 @@ namespace Coscine.Api.Project.Tests
[Test]
public void TestControllerGet()
{
var actionResult = Controller.Get(resources[0].Id.ToString());
var actionResult = Controller.Get(Resources[0].Id.ToString());
Assert.IsTrue(actionResult.GetType() == typeof(OkObjectResult));
OkObjectResult okObjectResult = (OkObjectResult)actionResult;
......@@ -35,18 +35,18 @@ namespace Coscine.Api.Project.Tests
ResourceObject projectObject = (ResourceObject)okObjectResult.Value;
Assert.IsTrue(projectObject.Id == resources[0].Id);
Assert.IsTrue(projectObject.ExternalId == resources[0].ExternalId);
Assert.IsTrue(projectObject.Type.Id == resources[0].Type.Id);
Assert.IsTrue(projectObject.Type.DisplayName == resources[0].Type.DisplayName);
Assert.IsTrue(projectObject.Url == resources[0].Url);
Assert.IsTrue(projectObject.Id == Resources[0].Id);
Assert.IsTrue(projectObject.ExternalId == Resources[0].ExternalId);
Assert.IsTrue(projectObject.Type.Id == Resources[0].Type.Id);
Assert.IsTrue(projectObject.Type.DisplayName == Resources[0].Type.DisplayName);
Assert.IsTrue(projectObject.Url == Resources[0].Url);
}
[Test]
public void TestControllerUpdate()
{
var actionResult = Controller.Get(resources[0].Id.ToString());
var actionResult = Controller.Get(Resources[0].Id.ToString());
OkObjectResult okObjectResult = (OkObjectResult)actionResult;
ResourceObject resourceObject = (ResourceObject)okObjectResult.Value;
......@@ -54,9 +54,9 @@ namespace Coscine.Api.Project.Tests
Stream stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
FakeControllerContext(users[0], stream);
FakeControllerContext(Users[0], stream);
actionResult = Controller.Update(resources[0].Id.ToString());
actionResult = Controller.Update(Resources[0].Id.ToString());
Assert.IsTrue(actionResult.GetType() == typeof(OkObjectResult));
// Cleanup
......@@ -64,11 +64,11 @@ namespace Coscine.Api.Project.Tests
stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
FakeControllerContext(users[0], stream);
FakeControllerContext(Users[0], stream);
try
{
actionResult = Controller.Update(resources[1].Id.ToString());
Controller.Update(Resources[1].Id.ToString());
Assert.Fail();
}
catch (Exception e)
......@@ -83,13 +83,13 @@ namespace Coscine.Api.Project.Tests
[Test]
public void TestControllerStoreToProject()
{
ResourceObject resourceObject = new ResourceObject(Guid.NewGuid(), "externalId", "http://rwth-aachen.de/newTest", new ResourceTypeObject(resourceTypes[0].Id, resourceTypes[0].DisplayName));
ResourceObject resourceObject = new ResourceObject(Guid.NewGuid(), "externalId", "http://rwth-aachen.de/newTest", new ResourceTypeObject(ResourceTypes[0].Id, ResourceTypes[0].DisplayName));
Stream stream = ObjectFactory<ResourceObject>.SerializeToStream(resourceObject);
FakeControllerContext(users[0], stream);
FakeControllerContext(Users[0], stream);
var actionResult = Controller.StoreToProject(projects[0].Id.ToString());
var actionResult = Controller.StoreToProject(Projects[0].Id.ToString());
Assert.IsTrue(actionResult.GetType() == typeof(OkObjectResult));
OkObjectResult okObjectResult = (OkObjectResult)actionResult;
resourceObject = (ResourceObject)okObjectResult.Value;
......@@ -101,7 +101,7 @@ namespace Coscine.Api.Project.Tests
var resource = resourceModel.GetById(resourceObject.Id);
ProjectResourceModel projectResourceModel = new ProjectResourceModel();
foreach(var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ProjectId == projects[0].Id && projectResource.ResourceId == resource.Id))
foreach(var projectResource in projectResourceModel.GetAllWhere((projectResource) => projectResource.ProjectId == Projects[0].Id && projectResource.ResourceId == resource.Id))
{
projectResourceModel.Delete(projectResource);
}
......
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
......@@ -78,6 +82,24 @@
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Coscine.Database" publicKeyToken="767d77427707b70a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.4.0.0" newVersion="1.4.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="AutoMapper" version="8.0.0" targetFramework="net472" />
<package id="AutoMapper.Extensions.Microsoft.DependencyInjection" version="6.0.0" targetFramework="net472" />
<package id="Castle.Core" version="4.4.0" targetFramework="net472" />
<package id="Consul" version="0.7.2.6" targetFramework="net472" />
<package id="Coscine.ApiCommons" version="1.0.0" targetFramework="net472" />
<package id="Coscine.Configuration" version="1.4.0" targetFramework="net472" />
<package id="Coscine.Database" version="1.3.0" targetFramework="net472" />
<package id="Coscine.Database" version="1.4.0" targetFramework="net472" />
<package id="EntityFramework" version="6.2.0" targetFramework="net472" />
<package id="linq2db" version="2.6.4" targetFramework="net472" />
<package id="linq2db.SqlServer" version="2.6.4" targetFramework="net472" />
<package id="linq2db.t4models" version="2.6.4" targetFramework="net472" />
<package id="LinqKit" version="1.1.16" targetFramework="net472" />
<package id="Microsoft.AspNetCore" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Antiforgery" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Authentication.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Authentication.Core" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Authorization" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Authorization.Policy" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Connections.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Cors" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Cryptography.Internal" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.DataProtection" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.DataProtection.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Diagnostics" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Diagnostics.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.HostFiltering" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Hosting" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Hosting.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Hosting.Server.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Html.Abstractions" version="2.2.0" targetFramework="net472" />
......@@ -23,31 +34,79 @@
<package id="Microsoft.AspNetCore.Http.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Http.Extensions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Http.Features" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.HttpOverrides" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.JsonPatch" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Localization" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Analyzers" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.ApiExplorer" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Core" version="2.2.2" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Cors" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.DataAnnotations" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Formatters.Json" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Localization" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Razor" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.Razor.Extensions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.RazorPages" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.TagHelpers" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Mvc.ViewFeatures" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Razor" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Razor.Design" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Razor.Language" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Razor.Runtime" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.ResponseCaching.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Routing" version="2.2.2" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Routing.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.IIS" version="2.2.2" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.IISIntegration" version="2.2.1" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.Kestrel" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.Kestrel.Core" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.Kestrel.Https" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.Kestrel.Transport.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" version="2.2.1" targetFramework="net472" />
<package id="Microsoft.AspNetCore.WebUtilities" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.CodeAnalysis.Analyzers" version="2.9.2" targetFramework="net472" />
<package id="Microsoft.CodeAnalysis.Common" version="3.0.0" targetFramework="net472" />
<package id="Microsoft.CodeAnalysis.CSharp" version="3.0.0" targetFramework="net472" />
<package id="Microsoft.CodeAnalysis.Razor" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.CSharp" version="4.5.0" targetFramework="net472" />
<package id="Microsoft.DiaSymReader.Native" version="1.7.0" targetFramework="net472" />
<package id="Microsoft.DotNet.PlatformAbstractions" version="2.1.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Caching.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Caching.Memory" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.Binder" version="2.2.4" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.CommandLine" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.EnvironmentVariables" version="2.2.4" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.FileExtensions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.Json" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Configuration.UserSecrets" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.DependencyInjection" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.DependencyModel" version="2.1.0" targetFramework="net472" />
<package id="Microsoft.Extensions.FileProviders.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.FileProviders.Composite" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.FileProviders.Physical" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.FileSystemGlobbing" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Hosting.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Localization" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Localization.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging.Configuration" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging.Console" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging.Debug" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Logging.EventSource" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.ObjectPool" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Options" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Options.ConfigurationExtensions" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.Primitives" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Extensions.WebEncoders" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.IdentityModel.JsonWebTokens" version="5.5.0" targetFramework="net472" />
<package id="Microsoft.IdentityModel.Logging" version="5.5.0" targetFramework="net472" />
<package id="Microsoft.IdentityModel.Tokens" version="5.5.0" targetFramework="net472" />
<package id="Microsoft.Net.Http.Headers" version="2.2.0" targetFramework="net472" />
<package id="Microsoft.Win32.Registry" version="4.5.0" targetFramework="net472" />
<package id="Moq" version="4.12.0" targetFramework="net472" />
......@@ -55,17 +114,48 @@
<package id="Newtonsoft.Json.Bson" version="1.0.2" targetFramework="net472" />
<package id="NUnit" version="3.11.0" targetFramework="net472" />
<package id="NUnit3TestAdapter" version="3.13.0" targetFramework="net472" />
<package id="System.AppContext" version="4.3.0" targetFramework="net472" />
<package id="System.Buffers" version="4.5.0" targetFramework="net472" />
<package id="System.Collections" version="4.3.0" targetFramework="net472" />
<package id="System.Collections.Immutable" version="1.5.0" targetFramework="net472" />
<package id="System.ComponentModel.Annotations" version="4.5.0" targetFramework="net472" />
<package id="System.Console" version="4.3.1" targetFramework="net472" />
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net472" />
<package id="System.Diagnostics.DiagnosticSource" version="4.5.1" targetFramework="net472" />
<package id="System.Diagnostics.FileVersionInfo" version="4.3.0" targetFramework="net472" />
<package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="net472" />
<package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net472" />
<package id="System.IdentityModel.Tokens.Jwt" version="5.5.0" targetFramework="net472" />
<package id="System.IO" version="4.3.0" targetFramework="net472" />
<package id="System.IO.Compression" version="4.3.0" targetFramework="net472" />
<package id="System.IO.FileSystem" version="4.3.0" targetFramework="net472" />
<package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.IO.Pipelines" version="4.5.3" targetFramework="net472" />
<package id="System.Linq" version="4.3.0" targetFramework="net472" />
<package id="System.Memory" version="4.5.2" targetFramework="net472" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
<package id="System.Reflection.Metadata" version="1.6.0" targetFramework="net472" />
<package id="System.Runtime" version="4.3.1" targetFramework="net472" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.2" targetFramework="net472" />
<package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net472" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net472" />
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net472" />
<package id="System.Security.AccessControl" version="4.5.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net472" />
<package id="System.Security.Cryptography.Cng" version="4.5.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net472" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net472" />
<package id="System.Security.Cryptography.Xml" version="4.5.0" targetFramework="net472" />
<package id="System.Security.Permissions" version="4.5.0" targetFramework="net472" />
<package id="System.Security.Principal.Windows" version="4.5.1" targetFramework="net472" />
<package id="System.Text.Encoding.CodePages" version="4.5.1" targetFramework="net472" />
<package id="System.Text.Encodings.Web" version="4.5.0" targetFramework="net472" />
<package id="System.Threading.Tasks.Extensions" version="4.5.2" targetFramework="net472" />
<package id="System.Threading.Tasks.Parallel" version="4.3.0" targetFramework="net472" />
<package id="System.Threading.Thread" version="4.3.0" targetFramework="net472" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net472" />
<package id="System.Xml.XPath" version="4.3.0" targetFramework="net472" />
<package id="System.Xml.XPath.XDocument" version="4.3.0" targetFramework="net472" />
</packages>
\ No newline at end of file
......@@ -89,6 +89,10 @@
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Coscine.Database" publicKeyToken="767d77427707b70a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.4.0.0" newVersion="1.4.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
......
using System;
using System.Collections.Generic;
using System.Net;
namespace Coscine.Api.Project
{
public class ApplicationInformation
{
public string AppName { get; set; } = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
public string AppType { get; set; } = "apis";
public Version Version { get; set; } = ToSemanticVersion(System.Reflection.Assembly.GetEntryAssembly().GetName().Version);
public string DomainName { get; set; } = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
public string HostName { get; set; } = Dns.GetHostName();
public string PathPrefix { get; set; } = $"coscine/api/{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}";
public Tuple<int, int> PortRange = new Tuple<int, int>(6001, 6999);
public int Port { get; set; } = 0;
public string AppBasePath { get { return $"coscine/{AppType}/{AppName}"; } }
public string TraefikBackendPath { get { return $"traefik/backends/{AppName}/servers/{HostName}"; } }
public string TraefikFrontendPath { get { return $"traefik/frontends/{AppName}"; } }
public Dictionary<string, string> AppValues
{
get
{
return new Dictionary<string, string>()
{
{ $"{AppBasePath}/port", $"{Port}" },
{ $"{AppBasePath}/name", $"{AppName}" },
{ $"{AppBasePath}/version", $"{Version}" }
};
}
}
public Dictionary<string, string> TraefikValues
{
get
{
return new Dictionary<string, string>()
{
{ $"{TraefikBackendPath}/url", $"http://{HostName}.{DomainName}:{Port}"},
{ $"{TraefikBackendPath}/weight", $"{1}"},
{ $"{TraefikFrontendPath}/backend", AppName},
{ $"{TraefikFrontendPath}/routes/{AppName}/rule", $"Host:{HostName}.{DomainName};PathPrefix:/{PathPrefix}"}
};
}
}
private static Version ToSemanticVersion(Version version)
{
return new Version(version.Major, version.Minor, version.Build);
}
}
}
using Coscine.Api.Project.Models;
using Coscine.Database.Model;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
namespace Coscine.Api.Project
{
public class Authenticator
{
private readonly Controller _controller;
public Authenticator(Controller controller)
{
_controller = controller;
}
public bool ValidUser()
{
try
{
GetUserFromToken();
}
catch (Exception)
{
return false;
}
return true;
}
public User GetUserFromToken()
{
var authorization = _controller.Request.Headers["Authorization"].ToArray();
string bearer = null;
foreach (var line in authorization)
{
if (line.Contains("Bearer"))
{
bearer = line;
}
}
if (!string.IsNullOrWhiteSpace(bearer))
{
bearer = bearer.Replace("Bearer", "").Trim();
JWTHandler jwtHandler = new JWTHandler(Program.Configuration);
var claims = jwtHandler.GetContents(bearer);
var userClaim = (from claimObj in claims
where claimObj.Type == "UserId"
select claimObj).First();
UserModel userModel = new UserModel();
return userModel.GetById(Guid.Parse(userClaim.Value));
}
else
{
throw new ArgumentException("Bearer Token is not set!");
}
}
public void ValidateAndExecute(Action<User> action)
{
action.Invoke(GetUserFromToken());
}
public T ValidateAndExecute<T>(Func<User, T> func)
{
return func.Invoke(GetUserFromToken());
}
// Todo: Add roles as parameter
public bool HasRequiredRights()
{
return true;
}
}
}
using Coscine.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
namespace Coscine.Api.Project
{
public class Configurator
{
public ApplicationInformation ApplicationInformation { get; set; } = new ApplicationInformation();
public IConfiguration Configuration { get; set; }
public Configurator(ApplicationInformation applicationInformation, IConfiguration configuration)
{
ApplicationInformation = applicationInformation;
Configuration = configuration;
}
public Configurator(IConfiguration configuration)
{
Configuration = configuration;
}
public void Register()
{
Register(ApplicationInformation);
}
public void Register(ApplicationInformation applicationInformation)
{
// Default app values
var keys = Configuration.Keys(applicationInformation.AppBasePath);
if (keys == null)
{
// No port overwrite
if (applicationInformation.Port == 0)
{
applicationInformation.Port = CalculatePort($"coscine/{applicationInformation.AppType}");
}
foreach (var kv in applicationInformation.AppValues.ToArray())
{
Configuration.Put(kv.Key, kv.Value);
}
}
else
{
// No port overwrite
if (applicationInformation.Port == 0) {
int.TryParse(Configuration.GetString($"{applicationInformation.AppBasePath}/port"), out int port);
applicationInformation.Port = port;
}
}
// Traefik Configuration
foreach (var kv in applicationInformation.TraefikValues.ToArray())
{
Configuration.Put(kv.Key, kv.Value);
}
}
private List<int> GetUsedConsulPorts(string appsPrefix)
{
var ports = new List<int>();
var keys = Configuration.Keys(appsPrefix);
if (keys != null)
{
foreach (var key in keys)
{
// maybe find a better solution
if (key.EndsWith("/port") && Configuration.Get(key) != null)
{
if (int.TryParse(Configuration.GetString(key), out int p))
{
ports.Add(p);
}
}
}
}
return ports;
}
private List<int> GetUsedSystemPorts()
{
return IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpConnections().Select(x => x.LocalEndPoint.Port).ToList();
}
private int CalculatePort(string appsPrefix)
{
var usedPorts = GetUsedConsulPorts(appsPrefix).Union(GetUsedSystemPorts())
.OrderBy(x => x);
return Enumerable.Range(ApplicationInformation.PortRange.Item1, ApplicationInformation.PortRange.Item2 - ApplicationInformation.PortRange.Item1).Except(usedPorts).First();
}
}
}
using Coscine.Api.Project.Exceptions;
using Coscine.Api.Project.Factories;
using Coscine.Api.Project.Models;
using Coscine.Api.Project.Models;
using Coscine.Api.Project.ReturnObjects;
using Coscine.ApiCommons;
using Coscine.ApiCommons.Exceptions;
using Coscine.ApiCommons.Factories;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
......@@ -14,7 +15,7 @@ namespace Coscine.Api.Project.Controllers
public ProjectController()
{
_authenticator = new Authenticator(this);
_authenticator = new Authenticator(this, Program.Configuration);
}
[Route("[controller]")]
......@@ -28,10 +29,7 @@ namespace Coscine.Api.Project.Controllers
where projectRole.User == user
&& projectRole.Role.DisplayName == "Owner"
select projectRole).Any()
).Select((project) =>
{
return new ProjectObject(project.Id, project.Description, project.DisplayName, project.Organization, project.StartDate, project.EndDate, project.Keywords);
});
).Select((project) => new ProjectObject(project.Id, project.Description, project.DisplayName, project.Organization, project.StartDate, project.EndDate, project.Keywords));
}));
}
......
using Coscine.Api.Project.Exceptions;
using Coscine.Api.Project.Factories;
using Coscine.Api.Project.Models;
using Coscine.Api.Project.Models;
using Coscine.Api.Project.ReturnObjects;
using Coscine.ApiCommons;
using Coscine.ApiCommons.Exceptions;
using Coscine.ApiCommons.Factories;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq;
......@@ -14,7 +15,7 @@ namespace Coscine.Api.Project.Controllers
public ResourceController()
{
_authenticator = new Authenticator(this);
_authenticator = new Authenticator(this, Program.Configuration);
}
[Route("[controller]")]
......@@ -30,10 +31,7 @@ namespace Coscine.Api.Project.Controllers
&& projectRole.Role.DisplayName == "Owner"
select projectRole).Any()
select projectResource).Any()
).Select((resource) =>
{
return new ResourceObject(resource.Id, resource.ExternalId, resource.Url, new ResourceTypeObject(resource.Type.Id, resource.Type.DisplayName));
});
).Select((resource) => new ResourceObject(resource.Id, resource.ExternalId, resource.Url, new ResourceTypeObject(resource.Type.Id, resource.Type.DisplayName)));
}));
}
......@@ -83,15 +81,15 @@ namespace Coscine.Api.Project.Controllers
}));
}
[HttpPost("[controller]/project/{project_id}")]
public IActionResult StoreToProject(string project_id)
[HttpPost("[controller]/project/{projectId}")]
public IActionResult StoreToProject(string projectId)
{
return Ok(_authenticator.ValidateAndExecute((user) =>
{
ResourceObject resourceObject = ObjectFactory<ResourceObject>.DeserializeFromStream(Request.Body);
ProjectModel projectModel = new ProjectModel();
var project = projectModel.GetById(Guid.Parse(project_id));
var project = projectModel.GetById(Guid.Parse(projectId));
if (projectModel.OwnsProject(user, project))
{
ResourceModel resourceModel = new ResourceModel();
......
using Coscine.Configuration;
using Coscine.Database.Model;
using System;
namespace Coscine.Api.Project
{
public class DatabaseConnection
{
private IConfiguration _configuration;
public DatabaseConnection(IConfiguration configuration)
{
_configuration = configuration;
}
private const string DbDataSourceKey = "coscine/global/db_data_source";
private const string DbNameKey = "coscine/global/db_name";
private const string DbUserIdKey = "coscine/global/db_user_id";
private const string DbPasswordKey = "coscine/global/db_password";
private string GetDbConnectionString()
{
var dbDataSource = _configuration.GetString(DbDataSourceKey);
var dbDatabase = _configuration.GetString(DbNameKey);
var dbUserId = _configuration.GetString(DbUserIdKey);
var dbPassword = _configuration.GetString(DbPasswordKey);
return $"Data Source={dbDataSource}; Database={dbDatabase}; User Id={dbUserId}; Password={dbPassword};";
}
private string GetProviderName()
{
return "SqlServer.2008";
}
public void ConnectToDatabase(Action<CoscineDB> action)
{
using (var coscineDB = new CoscineDB(GetProviderName(), GetDbConnectionString()))
{
action.Invoke(coscineDB);
}
}
public T ConnectToDatabase<T>(Func<CoscineDB, T> func)
{
T result;
using (var coscineDB = new CoscineDB(GetProviderName(), GetDbConnectionString()))
{
result = func.Invoke(coscineDB);
}
return result;
}
}
}
using System;
namespace Coscine.Api.Project.Exceptions
{
public class InvalidTokenException : Exception
{
public InvalidTokenException(string message) : base(message)
{
}
}
}
using System;
namespace Coscine.Api.Project.Exceptions
{
public class NotAuthorizedException : Exception
{
public NotAuthorizedException(string message) : base(message)
{
}
}
}
using System.IO;
using Newtonsoft.Json;
namespace Coscine.Api.Project.Factories
{
public class ObjectFactory<T>
{
public static Stream SerializeToStream(T o)
{
MemoryStream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
var json = JsonConvert.SerializeObject(o);
writer.Write(json);
writer.Flush();
stream.Position = 0;
return stream;
}
public static T DeserializeFromStream(Stream body)
{
var sr = new StreamReader(body);
var json = sr.ReadToEnd();
return JsonConvert.DeserializeObject<T>(json);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment