Get git projects from Gogs

This commit is contained in:
Robert Marshall 2020-01-03 17:19:50 +00:00
parent 9fd9beb860
commit 292d7729f2
9 changed files with 122 additions and 10 deletions

View file

@ -0,0 +1,27 @@
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Website.Data.States;
using Website.Models;
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<GitRepository>> GetRepositories() {
var response = await _client.GetStringAsync($"https://{_domain}/api/v1/users/rob/repos?token={_token}");
var states = JsonConvert.DeserializeObject<IEnumerable<GitRepositoryState>>(response);
return states.Select(state => new GitRepository(state));
}
}
}

View file

@ -0,0 +1,10 @@
namespace Website.Data.States {
public class GitRepositoryOwnerState {
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

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

View file

@ -0,0 +1,31 @@
using System;
namespace Website.Data.States {
public class GitRepositoryState {
public int id { get; set; }
public GitRepositoryOwnerState 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 GitRepositoryPermissionsState permissions { get; set; }
}
}

View file

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

View file

@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Authentication.Cookies; using System.Net.Http;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
@ -38,8 +39,9 @@ namespace Website
private void RegisterRepositories(IServiceCollection services) => private void RegisterRepositories(IServiceCollection services) =>
services.AddSingleton<IDatabaseProvider, MySQLDatabaseProvider>() services.AddSingleton<IDatabaseProvider, MySQLDatabaseProvider>()
.AddSingleton<BlogRepository, BlogRepository>() .AddSingleton<BlogRepository, BlogRepository>()
.AddSingleton<UserRepository, UserRepository>(); .AddSingleton<UserRepository, UserRepository>()
.AddSingleton(new GitServerApi(new HttpClient(), Configuration["gitDomain"], Configuration["gitToken"]));
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) public void Configure(IApplicationBuilder app, IHostingEnvironment env)

View file

@ -0,0 +1,19 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Website.Data;
namespace Website.ViewComponents {
public class ProjectNavigationViewComponent :ViewComponent {
private readonly GitServerApi _api;
public ProjectNavigationViewComponent(GitServerApi api) {
_api = api;
}
public async Task<IViewComponentResult> InvokeAsync() {
var repositories = await _api.GetRepositories();
return View(repositories.Take(5));
}
}
}

View file

@ -0,0 +1,9 @@
@model IEnumerable<Website.Models.GitRepository>
<h5>Projects:</h5>
<ul class="nav-list">
@foreach (var repository in Model) {
<li class="nav-list__link"><a href="@repository.Url">@repository.Name</a></li>
}
<li><a href="//git.robware.uk">View All</a></li>
</ul>

View file

@ -23,13 +23,7 @@
@RenderBody() @RenderBody()
</main> </main>
<nav> <nav>
<h5>Projects:</h5> @await Component.InvokeAsync("ProjectNavigation")
<ul>
<li><a href="link 1">Link 1</a></li>
<li><a href="link 2">Link 2</a></li>
<li><a href="link 3">Link 3</a></li>
<li><a href="//git.robware.uk">View All</a></li>
</ul>
@await Component.InvokeAsync("BlogNavigation") @await Component.InvokeAsync("BlogNavigation")
</nav> </nav>
</div> </div>