2021-05-13 20:03:07 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
2022-08-30 15:42:25 +02:00
|
|
|
|
using TINK.Model.Bikes;
|
2021-05-13 20:03:07 +02:00
|
|
|
|
using TINK.Model.Services.CopriApi;
|
|
|
|
|
using TINK.Model.Station;
|
|
|
|
|
|
2022-08-30 15:42:25 +02:00
|
|
|
|
using BikeInfo = TINK.Model.Bikes.BikeInfoNS.BC.BikeInfo;
|
2021-05-13 20:03:07 +02:00
|
|
|
|
|
|
|
|
|
namespace TINK.Model.Connector
|
|
|
|
|
{
|
|
|
|
|
/// <summary> Filters connector respones.</summary>
|
|
|
|
|
public class NullFilterConnector : IFilteredConnector
|
|
|
|
|
{
|
|
|
|
|
/// <summary> Constructs a filter object. </summary>
|
|
|
|
|
/// <param name="p_oGroup">Filter group.</param>
|
|
|
|
|
/// <param name="connector">Connector object.</param>
|
|
|
|
|
public NullFilterConnector(
|
|
|
|
|
IConnector connector)
|
|
|
|
|
{
|
|
|
|
|
Connector = connector;
|
|
|
|
|
|
|
|
|
|
if (Connector == null)
|
|
|
|
|
{
|
|
|
|
|
throw new ArgumentException("Can not construct filter object. Connector- and command objects must not be null.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Query = new QueryProvider(Connector.Query);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary> Inner connector object.</summary>
|
|
|
|
|
public IConnector Connector { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary> Command object. </summary>
|
|
|
|
|
public ICommand Command => Connector.Command;
|
|
|
|
|
|
|
|
|
|
/// <summary> Object to query information. </summary>
|
|
|
|
|
public IQuery Query { get; }
|
|
|
|
|
|
|
|
|
|
/// <summary> True if connector has access to copri server, false if cached values are used. </summary>
|
|
|
|
|
public bool IsConnected => Connector.IsConnected;
|
|
|
|
|
|
|
|
|
|
/// <summary> Object to perform filtered queries.</summary>
|
|
|
|
|
private class QueryProvider : IQuery
|
|
|
|
|
{
|
|
|
|
|
/// <summary> Holds the reference to object which performs copry queries.</summary>
|
|
|
|
|
private IQuery m_oInnerQuery;
|
|
|
|
|
|
|
|
|
|
/// <summary> Constructs a query object.</summary>
|
|
|
|
|
/// <param name="p_oInnerQuery"></param>
|
|
|
|
|
/// <param name="p_oFilter"></param>
|
2022-08-30 15:42:25 +02:00
|
|
|
|
public QueryProvider(IQuery p_oInnerQuery)
|
2021-05-13 20:03:07 +02:00
|
|
|
|
{
|
|
|
|
|
m_oInnerQuery = p_oInnerQuery;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary> Gets bikes either bikes available if no user is logged in or bikes available and bikes occupied if a user is logged in. </summary>
|
|
|
|
|
public async Task<Result<BikeCollection>> GetBikesAsync()
|
|
|
|
|
{
|
|
|
|
|
var result = await m_oInnerQuery.GetBikesAsync();
|
|
|
|
|
return new Result<BikeCollection>(
|
|
|
|
|
result.Source,
|
|
|
|
|
new BikeCollection(result.Response.ToDictionary(x => x.Id)),
|
2022-01-04 18:54:03 +01:00
|
|
|
|
result.GeneralData,
|
2021-05-13 20:03:07 +02:00
|
|
|
|
result.Exception);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary> Gets bikes occupied if a user is logged in. </summary>
|
|
|
|
|
public async Task<Result<BikeCollection>> GetBikesOccupiedAsync()
|
|
|
|
|
{
|
|
|
|
|
var result = await m_oInnerQuery.GetBikesOccupiedAsync();
|
|
|
|
|
return new Result<BikeCollection>(
|
|
|
|
|
result.Source,
|
|
|
|
|
new BikeCollection(result.Response.ToDictionary(x => x.Id)),
|
2022-01-04 18:54:03 +01:00
|
|
|
|
result.GeneralData,
|
2021-05-13 20:03:07 +02:00
|
|
|
|
result.Exception);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary> Gets all station applying filter rules. </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public async Task<Result<StationsAndBikesContainer>> GetBikesAndStationsAsync()
|
|
|
|
|
{
|
|
|
|
|
var result = await m_oInnerQuery.GetBikesAndStationsAsync();
|
|
|
|
|
|
|
|
|
|
return new Result<StationsAndBikesContainer>(
|
|
|
|
|
result.Source,
|
|
|
|
|
new StationsAndBikesContainer(
|
|
|
|
|
new StationDictionary(result.Response.StationsAll.CopriVersion, result.Response.StationsAll.ToDictionary(x => x.Id)),
|
|
|
|
|
new BikeCollection(result.Response.Bikes.ToDictionary(x => x.Id))),
|
2022-01-04 18:54:03 +01:00
|
|
|
|
result.GeneralData,
|
2021-05-13 20:03:07 +02:00
|
|
|
|
result.Exception);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary> Filter bikes by group. </summary>
|
2021-06-26 20:57:55 +02:00
|
|
|
|
/// <param name="bikes">Bikes to filter.</param>
|
2021-05-13 20:03:07 +02:00
|
|
|
|
/// <returns>Filtered bikes.</returns>
|
2021-06-26 20:57:55 +02:00
|
|
|
|
public static Dictionary<string, BikeInfo> DoFilter(BikeCollection bikes, IEnumerable<string> filter)
|
2021-05-13 20:03:07 +02:00
|
|
|
|
{
|
2021-06-26 20:57:55 +02:00
|
|
|
|
return bikes.Where(x => x.Group.Intersect(filter).Count() > 0).ToDictionary(x => x.Id);
|
2021-05-13 20:03:07 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary> Filter stations by broup. </summary>
|
|
|
|
|
/// <returns></returns>
|
2021-06-26 20:57:55 +02:00
|
|
|
|
public static Dictionary<string, IStation> DoFilter(StationDictionary stations, IEnumerable<string> p_oFilter)
|
2021-05-13 20:03:07 +02:00
|
|
|
|
{
|
2021-06-26 20:57:55 +02:00
|
|
|
|
return stations.Where(x => x.Group.Intersect(p_oFilter).Count() > 0).ToDictionary(x => x.Id);
|
2021-05-13 20:03:07 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|