Skip to content

Commit 0d88e7e

Browse files
users api get and post implementation
1 parent 0a5059b commit 0d88e7e

File tree

15 files changed

+178
-44
lines changed

15 files changed

+178
-44
lines changed

src/Microstack.API/Abstractions/IUserService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ namespace Microstack.API.Abstractions
99
public interface IUserService
1010
{
1111
public Task<IList<Profile>> GetProfiles(string userId);
12+
public Task PersistProfile(string userId, Profile profile);
1213
}
1314
}

src/Microstack.API/Controllers/UsersController.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ public async Task<IActionResult> PostProfile(string userId, [FromBody] Profile p
4343
if (invalidConfigurations.Count > 0)
4444
return BadRequest(invalidConfigurations);
4545

46+
try
47+
{
48+
await _userService.PersistProfile(userId, profile);
49+
}
50+
catch(Exception)
51+
{
52+
return StatusCode(500);
53+
}
54+
4655
return NoContent();
4756
}
4857
}

src/Microstack.API/Extensions/ProfileExtensions.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,13 @@ public static IList<Profile> MapFromPersistenceModel(this List<Microstack.Reposi
2121
}
2222
return result;
2323
}
24+
25+
public static Microstack.Repository.Models.Profile MapToRepositoryModel(this Profile profile)
26+
{
27+
var result = new Repository.Models.Profile();
28+
result.ProfileName = profile.FileName;
29+
result.Configurations = profile.Configurations;
30+
return result;
31+
}
2432
}
2533
}

src/Microstack.API/Services/UserService.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,10 @@ public async Task<IList<Profile>> GetProfiles(string userId)
2323
var profiles = await _persistenceProvider.GetProfilesForUser(userId);
2424
return profiles.MapFromPersistenceModel();
2525
}
26+
27+
public async Task PersistProfile(string userId, Profile profile)
28+
{
29+
await _persistenceProvider.PersistProfile(userId, profile.MapToRepositoryModel());
30+
}
2631
}
2732
}

src/Microstack.CLI/Commands/SubCommands/Users.cs

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using McMaster.Extensions.CommandLineUtils;
22
using Microstack.CLI.Helpers;
3+
using Microstack.Configuration.Abstractions;
4+
using Newtonsoft.Json;
35
using System;
46
using System.Collections.Generic;
7+
using System.Net.Http;
58
using System.Text;
69
using System.Threading.Tasks;
710

@@ -14,6 +17,7 @@ namespace Microstack.CLI.Commands.SubCommands
1417
public class Users : BaseCommand
1518
{
1619
private CommandLineApplication _app;
20+
private readonly IUserSettingsProvider _userSettingsProvider;
1721

1822
[Option(
1923
CommandOptionType.NoValue,
@@ -32,20 +36,81 @@ public class Users : BaseCommand
3236
ValueName = "UserId")]
3337
public string UserId { get; set; }
3438

35-
public Users(ConsoleHelper consoleHelper)
39+
[Option(
40+
CommandOptionType.NoValue,
41+
Description = "List user profiles",
42+
LongName = "profiles",
43+
ShortName = "p",
44+
ShowInHelpText = true
45+
)]
46+
public bool ShowProfiles { get; set; }
47+
48+
[Option(
49+
CommandOptionType.SingleValue,
50+
Description = "Add API Url",
51+
LongName = "url",
52+
ShortName = "ul",
53+
ShowInHelpText = true,
54+
ValueName = "URL"
55+
)]
56+
public string ApiUrl { get; set; }
57+
58+
public Users(ConsoleHelper consoleHelper, IUserSettingsProvider userSettingsProvider)
3659
{
3760
_consoleHelper = consoleHelper;
61+
_userSettingsProvider = userSettingsProvider;
3862
}
3963

4064
protected override async Task<int> OnExecute(CommandLineApplication app)
4165
{
4266
_app = app;
43-
if (!Validate())
67+
//if (!Validate())
68+
//{
69+
// return 1;
70+
//}
71+
72+
if (!string.IsNullOrWhiteSpace(ApiUrl))
73+
{
74+
_userSettingsProvider.AddSetting(ApiUrl);
75+
return 0;
76+
}
77+
78+
var settings = _userSettingsProvider.GetSettings();
79+
if (string.IsNullOrEmpty(settings))
4480
{
81+
OutputError("Missing api url, make sure to add a valid url, type microstack users --help for details");
4582
return 1;
46-
}
83+
}
4784

85+
if (!string.IsNullOrWhiteSpace(UserId))
86+
{
87+
if (ShowProfiles)
88+
{
89+
using (var client = new HttpClient())
90+
{
91+
client.BaseAddress = new Uri(settings);
92+
try
93+
{
94+
var response = await (await client.GetAsync($"/api/users/{UserId}")).Content.ReadAsStringAsync();
95+
var formattedJson = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(response), Formatting.Indented);
96+
OuputToConsole(formattedJson);
97+
return 0;
98+
}
99+
catch (Exception ex)
100+
{
101+
OutputError($"Error occurred while connecting to api {ex.Message}");
102+
return 1;
103+
}
104+
}
105+
}
106+
else
107+
{
108+
app.ShowHelp();
109+
return 1;
110+
}
111+
}
48112

113+
app.ShowHelp();
49114
return 0;
50115
}
51116

@@ -55,7 +120,7 @@ private bool Validate()
55120
var urlIsValid = Uri.TryCreate(microStackUrl, UriKind.Absolute, out Uri validUrl);
56121
if (string.IsNullOrWhiteSpace(microStackUrl) || !urlIsValid)
57122
{
58-
OutputError("MSTCK_API variable not found or empty or url is incorrect. Set a valid Microstack Url in order to use other users' workflows.");
123+
OutputError("MSTCK_API variable not found or empty or url is incorrect. Set a valid Microstack Url in order to use other users' workflows. Type microstack users --help for details");
59124
return false;
60125
}
61126

src/Microstack.CLI/Microstack.CLI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
<ItemGroup>
1010
<PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="3.0.0" />
11+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.8" />
1112
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
1213
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.8" />
1314
<PackageReference Include="McMaster.Extensions.Hosting.CommandLine" Version="3.0.0" />

src/Microstack.CLI/Program.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
using System.Threading;
2-
using McMaster.Extensions.CommandLineUtils;
32
using Microsoft.Extensions.DependencyInjection;
43
using Microsoft.Extensions.Hosting;
5-
using Microstack.CLI.Abstractions;
64
using Microstack.CLI.BackgroundTasks;
75
using Microstack.CLI.Commands;
8-
using Microstack.CLI;
96
using Microstack.CLI.Extensions;
107
using Microstack.Git;
118
using Microstack.Git.Abstractions;
129
using Microstack.CLI.Handlers;
1310
using Microstack.CLI.Helpers;
1411
using Microstack.CLI.Processor;
15-
using System;
16-
using Figgle;
12+
using Microstack.Configuration.Abstractions;
13+
using Microstack.Configuration;
1714

1815
namespace Microstack.CLI
1916
{
@@ -46,6 +43,7 @@ public static IHostBuilder CreateHostBuilder(string[] args) =>
4643
services.AddSingleton<ProcessQueueTask>();
4744
services.AddHostedService(sp => sp.GetRequiredService<ProcessQueueTask>());
4845
services.AddTransient<ConsoleHelper>();
46+
services.AddTransient<IUserSettingsProvider, UserSettingsProvider>();
4947
});
5048
}
5149
}

src/Microstack.CLI/Properties/launchSettings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"microstack": {
44
"commandName": "Project",
55
"executablePath": "C:\\github.com\\mstack\\microstack\\bin\\Debug\\netcoreapp3.1\\microstack.exe",
6-
"commandLineArgs": "run -v -c .mstkc2.json -p quotewf"
6+
//"commandLineArgs": "run -v -c .mstkc2.json -p quotewf"
7+
"commandLineArgs": "users -u sharthak_ghosh -p"
78
}
89
}
910
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace Microstack.Configuration.Abstractions
6+
{
7+
public interface IUserSettingsProvider
8+
{
9+
string GetSettings();
10+
void AddSetting(string url);
11+
}
12+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using Microstack.Configuration.Abstractions;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.IO;
5+
using System.Text;
6+
7+
namespace Microstack.Configuration
8+
{
9+
public class UserSettingsProvider : IUserSettingsProvider
10+
{
11+
public void AddSetting(string url)
12+
{
13+
var dirPath = Path.Combine(Environment.ExpandEnvironmentVariables("%userprofile%"), "AppData", "Local", ".microstack");
14+
File.WriteAllText(dirPath, url);
15+
}
16+
17+
public string GetSettings()
18+
{
19+
var dirPath = Path.Combine(Environment.ExpandEnvironmentVariables("%userprofile%"), "AppData", "Local", ".microstack");
20+
if (!File.Exists(dirPath))
21+
return string.Empty;
22+
23+
return File.ReadAllText(dirPath);
24+
}
25+
}
26+
}
Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
44
using System.Runtime.InteropServices;
5-
using System.Threading;
6-
using System.Threading.Tasks;
7-
using Microsoft.Extensions.DependencyInjection;
8-
using Microsoft.Extensions.Hosting;
9-
10-
namespace Microstack.Daemon.WindowsService
11-
{
12-
public static class Program
13-
{
14-
public static void Main(string[] args)
15-
{
16-
var cts = new CancellationTokenSource();
17-
CreateHostBuilder(args).Build().Run();
18-
}
19-
20-
public static IHostBuilder CreateHostBuilder(string[] args) =>
21-
Host.CreateDefaultBuilder(args)
22-
.UsePlatformSpecificHostService()
23-
.ConfigureServices((hostContext, services) =>
24-
{
25-
services.AddHostedService<MicroStackListner>();
26-
services.AddSingleton<ProcessStateManager>();
27-
});
28-
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Microsoft.Extensions.DependencyInjection;
8+
using Microsoft.Extensions.Hosting;
9+
10+
namespace Microstack.Daemon.WindowsService
11+
{
12+
public static class Program
13+
{
14+
public static void Main(string[] args)
15+
{
16+
var cts = new CancellationTokenSource();
17+
CreateHostBuilder(args).Build().Run();
18+
}
19+
20+
public static IHostBuilder CreateHostBuilder(string[] args) =>
21+
Host.CreateDefaultBuilder(args)
22+
.UsePlatformSpecificHostService()
23+
.ConfigureServices((hostContext, services) =>
24+
{
25+
services.AddHostedService<MicroStackListner>();
26+
services.AddSingleton<ProcessStateManager>();
27+
});
28+
2929
public static IHostBuilder UsePlatformSpecificHostService(this IHostBuilder builder)
3030
{
3131
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -34,6 +34,6 @@ public static IHostBuilder UsePlatformSpecificHostService(this IHostBuilder buil
3434
return builder.UseSystemd();
3535

3636
return builder;
37-
}
38-
}
39-
}
37+
}
38+
}
39+
}

src/Microstack.Repository/Abstractions/IPersistenceProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ namespace Microstack.Repository.Abstractions
99
public interface IPersistenceProvider
1010
{
1111
Task<List<Profile>> GetProfilesForUser(string userId);
12+
Task PersistProfile(string userId, Profile profile);
1213
}
1314
}

src/Microstack.Repository/Models/User.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class User
1111
[BsonId]
1212
public ObjectId Id { get; set; }
1313
public string UserId { get; set; }
14-
public IList<Profile> Profiles { get; set; } = new List<Profile>();
14+
public List<Profile> Profiles { get; set; } = new List<Profile>();
1515
}
1616

1717
public class Profile

src/Microstack.Repository/Providers/MongoProvider.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
using Microstack.Repository.Abstractions;
22
using Microstack.Repository.Models;
33
using MongoDB.Driver;
4-
using System;
54
using System.Collections.Generic;
65
using System.Linq;
7-
using System.Text;
86
using System.Threading.Tasks;
97

108
namespace Microstack.Repository.Providers
@@ -27,5 +25,14 @@ public async Task<List<Profile>> GetProfilesForUser(string userId)
2725
var result = (await userProfiles.FindAsync<User>(filter)).ToList();
2826
return result.SelectMany(r => r.Profiles).ToList();
2927
}
28+
29+
public async Task PersistProfile(string userId, Profile profile)
30+
{
31+
var filter = Builders<User>.Filter.Eq(f => f.UserId, userId);
32+
var userProfiles = _database.GetCollection<User>("user.profiles");
33+
var update = Builders<User>.Update.AddToSet<Profile>(p => p.Profiles, profile);
34+
35+
await userProfiles.UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = true });
36+
}
3037
}
3138
}

tests/APITests/UserTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public async Task Post_ShouldReturnNoContent()
5353
[Fact]
5454
public async Task Get_ShouldReturn404WhenUserNotFound()
5555
{
56-
using (var message = new HttpRequestMessage(HttpMethod.Get, "api/users/sharthak_ghosh"))
56+
using (var message = new HttpRequestMessage(HttpMethod.Get, "api/users/ghosh_sharthak"))
5757
{
5858
var result = await _client.SendAsync(message);
5959
result.StatusCode.Should().Be(404);

0 commit comments

Comments
 (0)