using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.ServiceModel.Syndication; using System.Threading.Tasks; using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using MongoDB.Driver; using MongoDB.Driver.Linq; using Nettle; using Wabbajack.BuildServer.Model.Models; using Wabbajack.BuildServer.Models; using Wabbajack.Common; using Wabbajack.Lib.ModListRegistry; namespace Wabbajack.BuildServer.Controllers { [ApiController] [Route("/lists")] public class ListValidation : AControllerBase { public ListValidation(ILogger logger, DBContext db, SqlService sql) : base(logger, db, sql) { } [HttpGet] [Route("status.json")] public async Task> HandleGetLists() { return await Db.ModListStatus.AsQueryable().Select(m => m.Summary).ToListAsync(); } private static readonly Func HandleGetRssFeedTemplate = NettleEngine.GetCompiler().Compile(@" {{lst.Name}} - Broken Mods http://build.wabbajack.org/status/{{lst.Name}}.html These are mods that are broken and need updating {{ each $.failed }} {{$.Archive.Name}} {{$.Archive.Hash}} {{$.Archive.State.PrimaryKeyString}} {{$.Archive.Name}} {{/each}} "); [HttpGet] [Route("status/{Name}/broken.rss")] public async Task HandleGetRSSFeed(string Name) { var lst = (await ModListStatus.ByName(Db, Name)).DetailedStatus; var response = HandleGetRssFeedTemplate(new { lst, failed = lst.Archives.Where(a => a.IsFailing).ToList(), passed = lst.Archives.Where(a => !a.IsFailing).ToList() }); return new ContentResult { ContentType = "application/rss+xml", StatusCode = (int) HttpStatusCode.OK, Content = response }; } private static readonly Func HandleGetListTemplate = NettleEngine.GetCompiler().Compile(@"

{{lst.Name}} - {{lst.Checked}} - {{ago}}min ago

Failed ({{failed.Count}}):

    {{each $.failed }}
  • {{$.Archive.Name}}
  • {{/each}}

Passed ({{passed.Count}}):

    {{each $.passed }}
  • {{$.Archive.Name}}
  • {{/each}}
"); [HttpGet] [Route("status/{Name}.html")] public async Task HandleGetListHtml(string Name) { var lst = (await ModListStatus.ByName(Db, Name)).DetailedStatus; var response = HandleGetListTemplate(new { lst, ago = (DateTime.UtcNow - lst.Checked).TotalMinutes, failed = lst.Archives.Where(a => a.IsFailing).ToList(), passed = lst.Archives.Where(a => !a.IsFailing).ToList() }); return new ContentResult { ContentType = "text/html", StatusCode = (int) HttpStatusCode.OK, Content = response }; } [HttpGet] [Route("status/{Name}.json")] public async Task HandleGetListJson(string Name) { var lst = (await ModListStatus.ByName(Db, Name)).DetailedStatus; lst.Archives.Do(a => a.Archive.Meta = null); return new ContentResult { ContentType = "application/json", StatusCode = (int) HttpStatusCode.OK, Content = lst.ToJSON() }; } } }