mirror of
https://gitlab.com/buildfeed/BuildFeed.git
synced 2024-03-22 21:10:34 +08:00
Prefer Interfaces in return values from data model
This commit is contained in:
parent
4687f43040
commit
d6b008d9d4
|
@ -1,10 +1,11 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace BuildFeed.Model.Api
|
||||
{
|
||||
public class NewBuildPost
|
||||
{
|
||||
public NewBuild[] NewBuilds { get; set; }
|
||||
public IReadOnlyCollection<NewBuild> NewBuilds { get; set; }
|
||||
public string Password { get; set; }
|
||||
public string Username { get; set; }
|
||||
}
|
||||
|
|
|
@ -11,12 +11,12 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public Task<ProjectFamily[]> SelectAllFamilies(int limit = -1, int skip = 0) => Task.Run(() =>
|
||||
public Task<IReadOnlyCollection<ProjectFamily>> SelectAllFamilies(int limit = -1, int skip = 0) => Task.Run(() =>
|
||||
{
|
||||
Array values = Enum.GetValues(typeof(ProjectFamily));
|
||||
if (values.Length == 0)
|
||||
{
|
||||
return Array.Empty<ProjectFamily>();
|
||||
return (IReadOnlyCollection<ProjectFamily>)Array.Empty<ProjectFamily>();
|
||||
}
|
||||
|
||||
var valuesWithoutNone = new ProjectFamily[values.Length - 1];
|
||||
|
@ -28,12 +28,12 @@ public Task<ProjectFamily[]> SelectAllFamilies(int limit = -1, int skip = 0) =>
|
|||
valuesWithoutNone[i] = (ProjectFamily)values.GetValue(j);
|
||||
}
|
||||
|
||||
return valuesWithoutNone;
|
||||
return (IReadOnlyCollection<ProjectFamily>)valuesWithoutNone;
|
||||
});
|
||||
|
||||
public Task<long> SelectAllFamiliesCount() => Task.Run(() => Enum.GetValues(typeof(ProjectFamily)).LongLength);
|
||||
|
||||
public async Task<List<Build>> SelectFamily(ProjectFamily family, int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectFamily(ProjectFamily family, int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument(nameof(Build.Family), family))
|
||||
.Sort(sortByOrder)
|
||||
|
@ -50,7 +50,7 @@ public async Task<List<Build>> SelectFamily(ProjectFamily family, int limit = -1
|
|||
public async Task<long> SelectFamilyCount(ProjectFamily family)
|
||||
=> await _buildCollection.CountDocumentsAsync(new BsonDocument(nameof(Build.Family), family));
|
||||
|
||||
public async Task<List<FamilyOverview>> SelectFamilyOverviews()
|
||||
public async Task<IReadOnlyCollection<FamilyOverview>> SelectFamilyOverviews()
|
||||
{
|
||||
var families = _buildCollection.Aggregate()
|
||||
.Sort(sortByOrder)
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public async Task<FrontBuildGroup[]> SelectAllGroups(int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<FrontBuildGroup>> SelectAllGroups(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Aggregate()
|
||||
.Group(new BsonDocument
|
||||
|
@ -74,7 +74,7 @@ public async Task<long> SelectAllGroupsCount()
|
|||
return grouping.Count;
|
||||
}
|
||||
|
||||
public async Task<List<Build>> SelectGroup(BuildGroup group, int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectGroup(BuildGroup group, int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument
|
||||
{
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public async Task<string[]> SelectAllLabs(int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<string>> SelectAllLabs(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Aggregate()
|
||||
.Group(new BsonDocument("_id", $"${nameof(Build.Lab)}"))
|
||||
|
@ -28,7 +28,7 @@ public async Task<string[]> SelectAllLabs(int limit = -1, int skip = 0)
|
|||
select g["_id"].AsString).ToArray();
|
||||
}
|
||||
|
||||
public async Task<string[]> SelectLabsForVersion(int major, int minor)
|
||||
public async Task<IReadOnlyCollection<string>> SelectLabsForVersion(int major, int minor)
|
||||
{
|
||||
var query = _buildCollection.Aggregate()
|
||||
.Match(new BsonDocument
|
||||
|
@ -46,7 +46,7 @@ public async Task<string[]> SelectLabsForVersion(int major, int minor)
|
|||
select g["_id"].AsString).ToArray();
|
||||
}
|
||||
|
||||
public async Task<List<string>> SearchLabs(string search)
|
||||
public async Task<IReadOnlyCollection<string>> SearchLabs(string search)
|
||||
{
|
||||
var result = await _buildCollection.Aggregate()
|
||||
.Match(b => b.Lab != null)
|
||||
|
@ -72,7 +72,7 @@ public async Task<long> SelectAllLabsCount()
|
|||
return grouping.Count;
|
||||
}
|
||||
|
||||
public async Task<List<Build>> SelectLab(string lab, int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectLab(string lab, int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument(nameof(Build.LabUrl), lab))
|
||||
.Sort(sortByCompileDate)
|
||||
|
|
|
@ -8,12 +8,12 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public Task<TypeOfSource[]> SelectAllSources(int limit = -1, int skip = 0)
|
||||
=> Task.Run(() => Enum.GetValues(typeof(TypeOfSource)) as TypeOfSource[]);
|
||||
public Task<IReadOnlyCollection<TypeOfSource>> SelectAllSources(int limit = -1, int skip = 0)
|
||||
=> Task.Run(() => Enum.GetValues(typeof(TypeOfSource)) as IReadOnlyCollection<TypeOfSource>);
|
||||
|
||||
public Task<long> SelectAllSourcesCount() => Task.Run(() => Enum.GetValues(typeof(TypeOfSource)).LongLength);
|
||||
|
||||
public async Task<List<Build>> SelectSource(TypeOfSource source, int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectSource(TypeOfSource source, int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument(nameof(Build.SourceType), source))
|
||||
.Sort(sortByOrder)
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public async Task<BuildVersion[]> SelectAllVersions(int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<BuildVersion>> SelectAllVersions(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Aggregate()
|
||||
.Group(new BsonDocument("_id",
|
||||
|
@ -52,7 +52,7 @@ public async Task<long> SelectAllVersionsCount()
|
|||
return query.Count;
|
||||
}
|
||||
|
||||
public async Task<List<Build>> SelectVersion(uint major, uint minor, int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectVersion(uint major, uint minor, int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument
|
||||
{
|
||||
|
|
|
@ -9,7 +9,7 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public async Task<int[]> SelectAllYears(int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<int>> SelectAllYears(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query =
|
||||
_buildCollection.Aggregate()
|
||||
|
@ -40,7 +40,7 @@ public async Task<long> SelectAllYearsCount()
|
|||
return query.Count;
|
||||
}
|
||||
|
||||
public async Task<List<Build>> SelectYear(int year, int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectYear(int year, int limit = -1, int skip = 0)
|
||||
{
|
||||
var query =
|
||||
_buildCollection.Find(Builders<Build>.Filter.And(Builders<Build>.Filter.Gte(b => b.BuildTime,
|
||||
|
|
|
@ -11,7 +11,7 @@ namespace BuildFeed.Model
|
|||
{
|
||||
public partial class BuildRepository
|
||||
{
|
||||
public const int CURRENT_LONG_TERM = (int)ProjectFamily.Redstone;
|
||||
public const int CURRENT_LONG_TERM = (int)ProjectFamily.Redstone5;
|
||||
public const int CURRENT_RELEASE = (int)ProjectFamily.Redstone5;
|
||||
public const int CURRENT_XBOX = (int)ProjectFamily.Redstone5;
|
||||
|
||||
|
@ -50,7 +50,9 @@ public BuildRepository(MongoConfig config)
|
|||
_buildCollection = buildDatabase.GetCollection<Build>(BUILD_COLLECTION_NAME);
|
||||
}
|
||||
|
||||
public async Task SetupIndexes()
|
||||
public async void SetupIndexes() => await SetupIndexesAsync();
|
||||
|
||||
private async Task SetupIndexesAsync()
|
||||
{
|
||||
var indexes = await (await _buildCollection.Indexes.ListAsync()).ToListAsync();
|
||||
|
||||
|
@ -133,20 +135,16 @@ await _buildCollection.Indexes.CreateOneAsync(new CreateIndexModel<Build>(Builde
|
|||
}
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, true)]
|
||||
public async Task<List<Build>> Select() => await _buildCollection.Find(new BsonDocument()).ToListAsync();
|
||||
public async Task<IReadOnlyCollection<Build>> Select() => await _buildCollection.Find(new BsonDocument()).ToListAsync();
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<Build> SelectById(Guid id)
|
||||
=> await _buildCollection.Find(Builders<Build>.Filter.Eq(b => b.Id, id)).SingleOrDefaultAsync();
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<Build> SelectByLegacyId(long id) => await _buildCollection
|
||||
.Find(Builders<Build>.Filter.Eq(b => b.LegacyId, id))
|
||||
.SingleOrDefaultAsync();
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<List<Build>> SelectBuildsByOrder(int limit = -1, int skip = 0)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectBuildsByOrder(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument()).Sort(sortByOrder).Skip(skip);
|
||||
|
||||
|
@ -158,8 +156,7 @@ public async Task<List<Build>> SelectBuildsByOrder(int limit = -1, int skip = 0)
|
|||
return await query.ToListAsync();
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<Dictionary<ProjectFamily, FrontPage>> SelectFrontPage()
|
||||
public async Task<IReadOnlyDictionary<ProjectFamily, FrontPage>> SelectFrontPage()
|
||||
{
|
||||
var families = new Dictionary<ProjectFamily, FrontPage>();
|
||||
|
||||
|
@ -299,8 +296,7 @@ public async Task<Dictionary<ProjectFamily, FrontPage>> SelectFrontPage()
|
|||
return families;
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<List<Build>> SelectBuildsByStringSearch(string term, int limit = -1)
|
||||
public async Task<IReadOnlyCollection<Build>> SelectBuildsByStringSearch(string term, int limit = -1)
|
||||
{
|
||||
var query = _buildCollection.Aggregate()
|
||||
.Match(b => b.FullBuildString != null)
|
||||
|
@ -315,15 +311,13 @@ public async Task<List<Build>> SelectBuildsByStringSearch(string term, int limit
|
|||
return await query.ToListAsync();
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<Build> SelectBuildByFullBuildString(string build) => await _buildCollection
|
||||
.Find(Builders<Build>.Filter.Eq(b => b.FullBuildString, build))
|
||||
.SingleOrDefaultAsync();
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<List<Build>> SelectBuildsByCompileDate(int limit = -1, int skip = 0)
|
||||
private async Task<IReadOnlyCollection<Build>> SelectBuildsBySortOption(BsonDocument sort, int limit, int skip)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument()).Sort(sortByCompileDate).Skip(skip);
|
||||
var query = _buildCollection.Find(new BsonDocument()).Sort(sort).Skip(skip);
|
||||
|
||||
if (limit > 0)
|
||||
{
|
||||
|
@ -333,33 +327,15 @@ public async Task<List<Build>> SelectBuildsByCompileDate(int limit = -1, int ski
|
|||
return await query.ToListAsync();
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<List<Build>> SelectBuildsByAddedDate(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument()).Sort(sortByAddedDate).Skip(skip);
|
||||
public Task<IReadOnlyCollection<Build>> SelectBuildsByCompileDate(int limit = -1, int skip = 0)
|
||||
=> SelectBuildsBySortOption(sortByCompileDate, limit, skip);
|
||||
|
||||
if (limit > 0)
|
||||
{
|
||||
query = query.Limit(limit);
|
||||
}
|
||||
public Task<IReadOnlyCollection<Build>> SelectBuildsByAddedDate(int limit = -1, int skip = 0)
|
||||
=> SelectBuildsBySortOption(sortByAddedDate, limit, skip);
|
||||
|
||||
return await query.ToListAsync();
|
||||
}
|
||||
public Task<IReadOnlyCollection<Build>> SelectBuildsByLeakedDate(int limit = -1, int skip = 0)
|
||||
=> SelectBuildsBySortOption(sortByLeakedDate, limit, skip);
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Select, false)]
|
||||
public async Task<List<Build>> SelectBuildsByLeakedDate(int limit = -1, int skip = 0)
|
||||
{
|
||||
var query = _buildCollection.Find(new BsonDocument()).Sort(sortByLeakedDate).Skip(skip);
|
||||
|
||||
if (limit > 0)
|
||||
{
|
||||
query = query.Limit(limit);
|
||||
}
|
||||
|
||||
return await query.ToListAsync();
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Insert, true)]
|
||||
public async Task Insert(Build item)
|
||||
{
|
||||
item.Id = Guid.NewGuid();
|
||||
|
@ -368,7 +344,6 @@ public async Task Insert(Build item)
|
|||
await _buildCollection.InsertOneAsync(item);
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Insert, false)]
|
||||
public async Task InsertAll(IEnumerable<Build> items)
|
||||
{
|
||||
var generatedItems = new List<Build>();
|
||||
|
@ -383,7 +358,6 @@ public async Task InsertAll(IEnumerable<Build> items)
|
|||
await _buildCollection.InsertManyAsync(generatedItems);
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Update, true)]
|
||||
public async Task Update(Build item)
|
||||
{
|
||||
Build old = await SelectById(item.Id);
|
||||
|
@ -404,7 +378,6 @@ public async Task RegenerateCachedProperties()
|
|||
}
|
||||
}
|
||||
|
||||
[DataObjectMethod(DataObjectMethodType.Delete, true)]
|
||||
public async Task DeleteById(Guid id)
|
||||
{
|
||||
await _buildCollection.DeleteOneAsync(Builders<Build>.Filter.Eq(b => b.Id, id));
|
||||
|
|
|
@ -32,9 +32,7 @@ public MongoConfig(string host, int? port, string database, string username, str
|
|||
public void SetupIndexes()
|
||||
{
|
||||
var b = new BuildRepository(this);
|
||||
#pragma warning disable 4014
|
||||
b.SetupIndexes();
|
||||
#pragma warning restore 4014
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,15 +6,15 @@ namespace BuildFeed.Model.View
|
|||
{
|
||||
public class SitemapData
|
||||
{
|
||||
public Dictionary<string, SitemapPagedAction[]> Actions { get; set; }
|
||||
public SitemapDataBuildGroup[] Builds { get; set; }
|
||||
public IReadOnlyDictionary<string, IReadOnlyCollection<SitemapPagedAction>> Actions { get; set; }
|
||||
public IReadOnlyCollection<SitemapDataBuildGroup> Builds { get; set; }
|
||||
|
||||
public string[] Labs { get; set; }
|
||||
public IReadOnlyCollection<string> Labs { get; set; }
|
||||
}
|
||||
|
||||
public class SitemapDataBuildGroup
|
||||
{
|
||||
public SitemapDataBuild[] Builds { get; set; }
|
||||
public IReadOnlyCollection<SitemapDataBuild> Builds { get; set; }
|
||||
public BuildGroup Id { get; set; }
|
||||
}
|
||||
|
||||
|
|
8
BuildFeed/Code/Pagination.cs
Normal file
8
BuildFeed/Code/Pagination.cs
Normal file
|
@ -0,0 +1,8 @@
|
|||
namespace BuildFeed
|
||||
{
|
||||
public struct Pagination
|
||||
{
|
||||
public int PageNumber;
|
||||
public int PageCount;
|
||||
}
|
||||
}
|
|
@ -53,11 +53,14 @@ public async Task<ActionResult> IndexPage(int page)
|
|||
{
|
||||
var buildGroups = await _bModel.SelectAllGroups(PAGE_SIZE, (page - 1) * PAGE_SIZE);
|
||||
|
||||
ViewBag.PageNumber = page;
|
||||
ViewBag.PageCount =
|
||||
Math.Ceiling(Convert.ToDouble(await _bModel.SelectAllGroupsCount()) / Convert.ToDouble(PAGE_SIZE));
|
||||
var pages = new Pagination
|
||||
{
|
||||
PageNumber = page,
|
||||
PageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(await _bModel.SelectAllGroupsCount()) / Convert.ToDouble(PAGE_SIZE)))
|
||||
};
|
||||
HttpContext.Features.Set(pages);
|
||||
|
||||
if (ViewBag.PageNumber > ViewBag.PageCount)
|
||||
if (pages.PageNumber > pages.PageCount)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
@ -85,7 +88,7 @@ public async Task<ActionResult> ViewGroup(uint major, uint minor, uint number, u
|
|||
{
|
||||
id = builds.Single().Id
|
||||
}) as ActionResult
|
||||
: View(new Tuple<BuildGroup, List<Build>>(bg, builds));
|
||||
: View(new Tuple<BuildGroup, IReadOnlyCollection<Build>>(bg, builds));
|
||||
}
|
||||
|
||||
[Route("build/{id:guid}/", Name = "Build")]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
@using Microsoft.AspNetCore.Html
|
||||
@model Dictionary<ProjectFamily, FrontPage>
|
||||
@model IReadOnlyDictionary<ProjectFamily, FrontPage>
|
||||
@{
|
||||
ViewBag.Title = string.Format(VariantTerms.Front_HomeH1, InvariantTerms.SiteName);
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
@using Humanizer
|
||||
@model Tuple<BuildGroup, List<Build>>
|
||||
@model Tuple<BuildGroup, IReadOnlyCollection<Build>>
|
||||
@{
|
||||
ViewBag.Title = $"{Model.Item1} | {InvariantTerms.SiteName}";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user