Use new projects API

This commit is contained in:
Robert Marshall 2020-04-12 11:09:04 +01:00
parent 11bca4cf53
commit 8bf483b334
24 changed files with 141 additions and 222 deletions

View file

@ -7,18 +7,18 @@ using System.Linq;
namespace Website.Controllers {
public class HomeController : Controller {
private readonly IBlogApi _blogApi;
private readonly GitServerApi _api;
private readonly IGitApi _api;
public HomeController(IBlogApi blogApi, GitServerApi api) {
public HomeController(IBlogApi blogApi, IGitApi api) {
_api = api;
_blogApi = blogApi;
}
public async Task<IActionResult> Index() {
var post = await _blogApi.GetLatestPostAsync();
var repo = (await _api.GetRepositories()).First();
var branch = (await _api.GetBranches(repo.Name)).First();
var commit = await _api.GetCommit(repo.Name, branch.Commit.Id);
var repo = (await _api.GetRepositories("rob")).First();
var branch = (await _api.GetBranches("rob", repo.Name)).First();
var commit = await _api.GetCommit("rob", repo.Name, branch.Commit.Id);
var model = new HomeViewModel {
BlogPost = new BlogPostViewModel(post, false),

16
Website/Data/GitApi.cs Normal file
View file

@ -0,0 +1,16 @@
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Website.Models.Git;
namespace Website.Data {
public class GitApi : ApiClient, IGitApi {
public GitApi(HttpClient client) : base(client) {
}
public async Task<IEnumerable<Repository>> GetRepositories(string user) => await Get<IEnumerable<Repository>>("repositories", new { user });
public async Task<IEnumerable<Branch>> GetBranches(string user, string repository) => await Get<IEnumerable<Branch>>("branches", new {user, repository});
public async Task<Commit> GetCommit(string user, string repository, string hash) => await Get<Commit>("commit", new {user, repository, hash});
}
}

View file

@ -1,39 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Website.Data.States.Git;
using Website.Models.Git;
namespace Website.Data {
public class GitServerApi {
private readonly HttpClient _client;
private readonly string _domain;
private readonly string _token;
public GitServerApi(HttpClient client, string domain, string token) {
_client = client;
_domain = domain;
_token = token;
}
public async Task<IEnumerable<Repository>> GetRepositories() {
var response = await _client.GetStringAsync($"https://{_domain}/api/v1/users/rob/repos?token={_token}");
var states = JsonConvert.DeserializeObject<IEnumerable<RepositoryState>>(response);
return states.Select(state => new Repository(state));
}
public async Task<IEnumerable<Branch>> GetBranches(string repository) {
var response = await _client.GetStringAsync($"https://{_domain}/api/v1/repos/rob/{repository}/branches?token={_token}");
var states = JsonConvert.DeserializeObject<IEnumerable<BranchState>>(response);
return states.Select(state => new Branch(state));
}
public async Task<Commit> GetCommit(string repository, string hash) {
var response = await _client.GetStringAsync($"https://{_domain}/api/v1/repos/rob/{repository}/commits/{hash}?token={_token}");
var state = JsonConvert.DeserializeObject<CommitDetailsState>(response);
return new Commit(state);
}
}
}

11
Website/Data/IGitApi.cs Normal file
View file

@ -0,0 +1,11 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Website.Models.Git;
namespace Website.Data {
public interface IGitApi {
Task<IEnumerable<Repository>> GetRepositories(string user);
Task<IEnumerable<Branch>> GetBranches(string user, string repository);
Task<Commit> GetCommit(string user, string repository, string hash);
}
}

View file

@ -1,10 +0,0 @@
using System;
namespace Website.Data.States.Git {
public class AuthorState {
public string name { get; set; }
public string email { get; set; }
public string username { get; set; }
public DateTimeOffset date { get; set; }
}
}

View file

@ -1,7 +0,0 @@
namespace Website.Data.States.Git {
public class BranchState
{
public string name { get; set; }
public CommitState commit { get; set; }
}
}

View file

@ -1,11 +0,0 @@
namespace Website.Data.States.Git {
public class CommitDetailsState {
public string url { get; set; }
public string sha { get; set; }
public string html_url { get; set; }
public CommitState commit { get; set; }
public UserState author { get; set; }
public UserState committer { get; set; }
public CommitPointerState[] parents { get; set; }
}
}

View file

@ -1,6 +0,0 @@
namespace Website.Data.States.Git {
public partial class CommitPointerState {
public string url { get; set; }
public string sha { get; set; }
}
}

View file

@ -1,16 +0,0 @@
using System;
namespace Website.Data.States.Git {
public class CommitState {
public string id { get; set; }
public string message { get; set; }
public string url { get; set; }
public AuthorState author { get; set; }
public AuthorState committer { get; set; }
public object added { get; set; }
public object removed { get; set; }
public object modified { get; set; }
public DateTimeOffset timestamp { get; set; }
public CommitPointerState tree { get; set; }
}
}

View file

@ -1,10 +0,0 @@
namespace Website.Data.States.Git {
public class RepositoryOwnerState {
public int id { get; set; }
public string username { get; set; }
public string login { get; set; }
public string full_name { get; set; }
public string email { get; set; }
public string avatar_url { get; set; }
}
}

View file

@ -1,7 +0,0 @@
namespace Website.Data.States.Git {
public class RepositoryPermissionsState {
public bool admin { get; set; }
public bool push { get; set; }
public bool pull { get; set; }
}
}

View file

@ -1,31 +0,0 @@
using System;
namespace Website.Data.States.Git {
public class RepositoryState {
public int id { get; set; }
public RepositoryOwnerState owner { get; set; }
public string name { get; set; }
public string full_name { get; set; }
public string description { get; set; }
public bool _private { get; set; }
public bool fork { get; set; }
public object parent { get; set; }
public bool empty { get; set; }
public bool mirror { get; set; }
public int size { get; set; }
public string html_url { get; set; }
public string ssh_url { get; set; }
public string clone_url { get; set; }
public string website { get; set; }
public int stars_count { get; set; }
public int forks_count { get; set; }
public int watchers_count { get; set; }
public int open_issues_count { get; set; }
public string default_branch { get; set; }
public DateTime created_at { get; set; }
public DateTime updated_at { get; set; }
public RepositoryPermissionsState permissions { get; set; }
}
}

View file

@ -1,10 +0,0 @@
namespace Website.Data.States.Git {
public partial class UserState {
public long id { get; set; }
public string username { get; set; }
public string login { get; set; }
public string full_name { get; set; }
public string email { get; set; }
public string avatar_url { get; set; }
}
}

View file

@ -1,14 +1,6 @@
using Website.Data.States.Git;
namespace Website.Models.Git {
namespace Website.Models.Git {
public class Branch {
public Branch(BranchState state) {
Name = state.name;
Commit = new Commit(state.commit);
}
public string Name { get; }
public Commit Commit { get; private set; }
public string Name { get; set; }
public Commit Commit { get; set; }
}
}
}

View file

@ -1,24 +1,10 @@
using System;
using Website.Data.States.Git;
using System;
namespace Website.Models.Git {
public class Commit {
public Commit(CommitState commit) {
Id = commit.id;
Message = commit.message;
Timestamp = commit.timestamp;
}
public Commit(CommitDetailsState commit) {
Id = commit.sha;
Message = commit.commit.message;
Timestamp = commit.commit.author.date;
Url = commit.html_url.Replace("/commits/", "/commit/");
}
public string Id { get; }
public string Message { get; }
public DateTimeOffset Timestamp { get; }
public string Url { get; }
public string Id { get; set; }
public string Message { get; set; }
public DateTimeOffset Timestamp { get; set; }
public string Url { get; set; }
}
}
}

View file

@ -1,13 +1,6 @@
using Website.Data.States.Git;
namespace Website.Models.Git {
namespace Website.Models.Git {
public class Repository {
public Repository(RepositoryState state) {
Name = state.name;
Url = state.html_url;
}
public string Name { get; set; }
public string Url { get; set; }
}
}
}

View file

@ -32,7 +32,14 @@ namespace Website
});
services.AddSingleton(Configuration);
RegisterRepositories(services);
services.AddSingleton<IDatabaseProvider, MySQLDatabaseProvider>()
.AddSingleton<UserRepository, UserRepository>();
services.AddHttpClient<IGitApi, GitApi>(client => client.BaseAddress = new Uri(Configuration["gitApiEndpoint"]))
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true});
services.AddHttpClient<IBlogApi, BlogApi>(client => client.BaseAddress = new Uri(Configuration["blogApiEndpoint"]))
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();
@ -43,16 +50,6 @@ namespace Website
;
}
private void RegisterRepositories(IServiceCollection services) =>
services.AddSingleton<IDatabaseProvider, MySQLDatabaseProvider>()
.AddSingleton<IBlogApi, BlogApi>()
.AddSingleton<UserRepository, UserRepository>()
.AddSingleton(new GitServerApi(new HttpClient(), Configuration["gitDomain"], Configuration["gitToken"]))
.AddHttpClient<IBlogApi, BlogApi>(client => client.BaseAddress = new Uri(Configuration["blogApiEndpoint"]))
.ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler {
ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true
});
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{

View file

@ -5,14 +5,14 @@ using Website.Data;
namespace Website.ViewComponents {
public class ProjectNavigationViewComponent :ViewComponent {
private readonly GitServerApi _api;
private readonly IGitApi _api;
public ProjectNavigationViewComponent(GitServerApi api) {
public ProjectNavigationViewComponent(IGitApi api) {
_api = api;
}
public async Task<IViewComponentResult> InvokeAsync() {
var repositories = await _api.GetRepositories();
var repositories = await _api.GetRepositories("rob");
return View(repositories.Take(5));
}
}

View file

@ -23,7 +23,7 @@
</ItemGroup>
<Target Name="BuildCss" BeforeTargets="Build">
<Exec WorkingDirectory="$(ProjectDir)" Command="npm install" />
<Exec WorkingDirectory="$(ProjectDir)" Command="npx gulp compile_scss" />
<!--<Exec WorkingDirectory="$(ProjectDir)" Command="npm install" />
<Exec WorkingDirectory="$(ProjectDir)" Command="npx gulp compile_scss" />-->
</Target>
</Project>

View file

@ -9,7 +9,6 @@
"ConnectionStrings": {
"database": "Server=localhost;User ID=user;Password=pass;Database=db"
},
"gitDomain": "",
"gitToken": "",
"blogApiEndpoint": ""
"blogApiEndpoint": "",
"gitApiEndpoint": ""
}

View file

@ -7,9 +7,8 @@
"ConnectionStrings": {
"database": "<DatabaseConnectionString>"
},
"gitDomain": "<GitDomain>",
"gitToken": "<GitToken>",
"blogApiEndpoint": "<BlogEndpoint>",
"gitApiEndpoint": "<GitEndpoint>",
"AllowedHosts": "*",
"Kestrel": {
"EndPoints": {