Start generating parse methods (#4)
Co-authored-by: Smaug123 <patrick+github@patrickstevens.co.uk> Reviewed-on: #4
This commit is contained in:
356
PureGym/Api.fs
356
PureGym/Api.fs
@@ -2,361 +2,7 @@ namespace PureGym
|
||||
|
||||
open System
|
||||
open System.Net.Http
|
||||
open System.Text.Json.Serialization
|
||||
open System.Threading.Tasks
|
||||
open RestEase
|
||||
|
||||
/// Describes the opening hours of a given gym.
|
||||
type GymOpeningHours =
|
||||
{
|
||||
/// If this is true, there should be no OpeningHours (but nothing enforces that).
|
||||
IsAlwaysOpen : bool
|
||||
/// This is a pretty unstructured list, which is in general not really parseable: it's human-readable only.
|
||||
OpeningHours : string list
|
||||
}
|
||||
|
||||
/// Human-readable representation
|
||||
override this.ToString () =
|
||||
if this.IsAlwaysOpen then
|
||||
"always open"
|
||||
else
|
||||
this.OpeningHours |> String.concat ", "
|
||||
|
||||
/// How a human can authenticate with a gym when they physically try to enter it
|
||||
type GymAccessOptions =
|
||||
{
|
||||
/// This gym has PIN entry pads
|
||||
PinAccess : bool
|
||||
/// This gym has a QR code scanner. QR codes can be generated with the PureGym app.
|
||||
QrCodeAccess : bool
|
||||
}
|
||||
|
||||
/// Human-readable representation
|
||||
override this.ToString () =
|
||||
$"Pin access: %c{Char.emoji this.PinAccess}; QR code access: %c{Char.emoji this.QrCodeAccess}"
|
||||
|
||||
/// Where a gym is on the Earth
|
||||
type GymLocation =
|
||||
{
|
||||
/// Measured in degrees
|
||||
Longitude : float
|
||||
/// Measured in degrees
|
||||
Latitude : float
|
||||
}
|
||||
|
||||
/// The postal address of a gym
|
||||
type GymAddress =
|
||||
{
|
||||
/// E.g. "Canterbury Court"
|
||||
[<JsonRequired>]
|
||||
AddressLine1 : string
|
||||
/// E.g. "Units 4, 4A, 5 And 5A"
|
||||
AddressLine2 : string
|
||||
/// E.g. "Kennington Park"
|
||||
AddressLine3 : string
|
||||
/// E.g. "LONDON"
|
||||
[<JsonRequired>]
|
||||
Town : string
|
||||
County : string
|
||||
/// E.g. "SW9 6DE"
|
||||
[<JsonRequired>]
|
||||
Postcode : string
|
||||
}
|
||||
|
||||
/// Human-readable statement of the address
|
||||
override this.ToString () =
|
||||
[
|
||||
yield Some this.AddressLine1
|
||||
yield this.AddressLine2 |> Option.ofObj
|
||||
yield this.AddressLine3 |> Option.ofObj
|
||||
match this.County with
|
||||
| null -> yield Some $"%s{this.Town} %s{this.Postcode}"
|
||||
| county ->
|
||||
yield Some this.Town
|
||||
yield Some $"%s{county} %s{this.Postcode}"
|
||||
]
|
||||
|> Seq.choose id
|
||||
|> String.concat "\n"
|
||||
|
||||
/// Metadata about a physical gym
|
||||
type Gym =
|
||||
{
|
||||
// The following fields are returned but are always null
|
||||
// ReasonsToJoin : string
|
||||
// VirtualTourUrl : Uri
|
||||
// PersonalTrainersUrl : Uri
|
||||
// WebViewUrl : Uri
|
||||
// FloorPlanUrl : Uri
|
||||
// StaffMembers : string
|
||||
|
||||
/// The name of this gym, e.g. "London Oval"
|
||||
[<JsonRequired>]
|
||||
Name : string
|
||||
/// This gym's ID in the PureGym system, e.g. 19
|
||||
[<JsonRequired>]
|
||||
Id : int
|
||||
/// I don't know what this status is. Please tell me if you know!
|
||||
[<JsonRequired>]
|
||||
Status : int
|
||||
/// Postal address of this gym
|
||||
[<JsonRequired>]
|
||||
Address : GymAddress
|
||||
/// Phone number of this gym, e.g. "+44 1234 567890"
|
||||
[<JsonRequired>]
|
||||
PhoneNumber : string
|
||||
/// Contact email address for this gym's staff
|
||||
[<JsonRequired>]
|
||||
EmailAddress : string
|
||||
/// When this gym is open
|
||||
[<JsonRequired>]
|
||||
GymOpeningHours : GymOpeningHours
|
||||
/// How a human can physically authenticate when they physically enter this gym
|
||||
[<JsonRequired>]
|
||||
AccessOptions : GymAccessOptions
|
||||
/// Where this gym is physically located
|
||||
[<JsonRequired>]
|
||||
Location : GymLocation
|
||||
/// The IANA time zone this gym observes, e.g. "Europe/London"
|
||||
[<JsonRequired>]
|
||||
TimeZone : string
|
||||
/// This is a date-time in the format yyyy-MM-ddTHH:mm:ss+01 Europe/London
|
||||
ReopenDate : string
|
||||
}
|
||||
|
||||
/// Human-readable representation of the most important information about this gym
|
||||
override this.ToString () =
|
||||
$"""%s{this.Name} (%i{this.Id})
|
||||
{this.Address}
|
||||
%s{this.EmailAddress} %s{this.PhoneNumber}
|
||||
Opening hours: %s{string<GymOpeningHours> this.GymOpeningHours}
|
||||
%s{string<GymAccessOptions> this.AccessOptions}
|
||||
"""
|
||||
|
||||
/// A human member of PureGym
|
||||
type Member =
|
||||
{
|
||||
/// This member's ID. This is a fairly large number.
|
||||
Id : int
|
||||
/// No idea what this is - please tell me if you know!
|
||||
CompoundMemberId : string
|
||||
/// First name, e.g. "Patrick"
|
||||
FirstName : string
|
||||
/// Last name, e.g. "Stevens"
|
||||
LastName : string
|
||||
/// ID of the gym designated as this user's home gym. This is also the "Id" field of the appropriate Gym object.
|
||||
HomeGymId : int
|
||||
/// The name of the gym designated as this user's home gym. This is also the "Name" field of the appropriate
|
||||
/// Gym object.
|
||||
HomeGymName : string
|
||||
/// This user's email address
|
||||
EmailAddress : string
|
||||
/// This user's gym access pin, probably 8 digits
|
||||
GymAccessPin : string
|
||||
/// This user's recorded date of birth
|
||||
DateOfBirth : DateOnly
|
||||
/// This user's phone number, human-readable
|
||||
MobileNumber : string
|
||||
/// This user's registered home postcode
|
||||
Postcode : string
|
||||
/// E.g. "Corporate"
|
||||
MembershipName : string
|
||||
MembershipLevel : int
|
||||
SuspendedReason : int
|
||||
MemberStatus : int
|
||||
}
|
||||
|
||||
/// Statistics for how many people are currently at a gym
|
||||
type GymAttendance =
|
||||
{
|
||||
/// This appears always to be just equal to TotalPeopleInGym, but a string.
|
||||
[<JsonRequired>]
|
||||
Description : string
|
||||
/// How many people are in the gym as of this statistics snapshot
|
||||
[<JsonRequired>]
|
||||
TotalPeopleInGym : int
|
||||
/// How many people are in classes at the gym as of this statistics snapshot
|
||||
[<JsonRequired>]
|
||||
TotalPeopleInClasses : int
|
||||
/// E.g. " or fewer"
|
||||
TotalPeopleSuffix : string
|
||||
[<JsonRequired>]
|
||||
IsApproximate : bool
|
||||
/// When the query was received (I think)
|
||||
AttendanceTime : DateTime
|
||||
/// When the "total people in gym" snapshot was taken that is reported here
|
||||
LastRefreshed : DateTime
|
||||
/// When the "number of people in classes" snapshot was taken that is reported here
|
||||
LastRefreshedPeopleInClasses : DateTime
|
||||
/// Maximum capacity of the gym, or 0 if no listed capacity
|
||||
MaximumCapacity : int
|
||||
}
|
||||
|
||||
/// Human-readable representation
|
||||
override this.ToString () =
|
||||
let totalPeopleSuffix =
|
||||
match this.TotalPeopleSuffix with
|
||||
| null -> ""
|
||||
| suffix -> suffix
|
||||
|
||||
let capacity =
|
||||
if this.MaximumCapacity = 0 then
|
||||
""
|
||||
else
|
||||
$" out of %i{this.MaximumCapacity} maximum"
|
||||
|
||||
let classes =
|
||||
if this.TotalPeopleInClasses = 0 then
|
||||
""
|
||||
else
|
||||
$"\n%i{this.TotalPeopleInClasses} in classes"
|
||||
|
||||
$"""%i{this.TotalPeopleInGym}%s{totalPeopleSuffix} in gym%s{capacity} (is exact: %c{Char.emoji (not this.IsApproximate)})%s{classes}
|
||||
Query made at %s{this.AttendanceTime.ToString "s"}%s{this.AttendanceTime.ToString "zzz"}
|
||||
Snapshot correct as of %s{this.LastRefreshed.ToString "s"}%s{this.LastRefreshed.ToString "zzz"}
|
||||
Classes info correct as of %s{this.LastRefreshedPeopleInClasses.ToString "s"}%s{this.LastRefreshedPeopleInClasses.ToString "zzz"}"""
|
||||
|
||||
/// The visit statistics for a particular human to a particular gym.
|
||||
/// The semantics of this class are basically unknown.
|
||||
type MemberActivityThisMonth =
|
||||
{
|
||||
/// How many minutes, including classes, have been logged so far this month
|
||||
TotalDurationMinutes : int
|
||||
/// How long, in minutes, each visit has been on average this month
|
||||
AverageDurationMinutes : int
|
||||
/// How many visits have been made this month, excluding classes
|
||||
TotalVisits : int
|
||||
/// How many classes have been attended this month
|
||||
TotalClasses : int
|
||||
/// Whether this block of statistics is estimated rather than exact
|
||||
IsEstimated : bool
|
||||
/// When this data was constructed
|
||||
LastRefreshed : DateTime
|
||||
}
|
||||
|
||||
/// Don't use this type. It's public because System.Text.Json can't do private types.
|
||||
type MemberActivityDto =
|
||||
{
|
||||
[<JsonRequired>]
|
||||
TotalDuration : int
|
||||
[<JsonRequired>]
|
||||
AverageDuration : int
|
||||
[<JsonRequired>]
|
||||
TotalVisits : int
|
||||
[<JsonRequired>]
|
||||
TotalClasses : int
|
||||
[<JsonRequired>]
|
||||
IsEstimated : bool
|
||||
[<JsonRequired>]
|
||||
LastRefreshed : DateTime
|
||||
}
|
||||
|
||||
member this.ToMemberActivity () =
|
||||
{
|
||||
TotalDurationMinutes = this.TotalDuration
|
||||
AverageDurationMinutes = this.AverageDuration
|
||||
TotalVisits = this.TotalVisits
|
||||
TotalClasses = this.TotalClasses
|
||||
IsEstimated = this.IsEstimated
|
||||
LastRefreshed = this.LastRefreshed
|
||||
}
|
||||
|
||||
type SessionsAggregate =
|
||||
{
|
||||
/// Number of gym "activities" within some query-defined time period; presumably this is like classes?
|
||||
/// It's always 0 for me.
|
||||
Activities : int
|
||||
/// Number of visits to the gym within some query-defined time period.
|
||||
Visits : int
|
||||
/// In minutes: total time spent in gym during the query-defined time period.
|
||||
Duration : int
|
||||
}
|
||||
|
||||
/// The DTO for gym info returned from the Sessions endpoint.
|
||||
type VisitGym =
|
||||
{
|
||||
// Omitting Location, GymAccess, ContactInfo, TimeZone because these were all null for me
|
||||
/// The PureGym ID of this gym, e.g. 19
|
||||
Id : int
|
||||
/// E.g. "London Oval", the canonical name of this gym
|
||||
Name : string
|
||||
/// For some reason this always seems to be "Blocked"
|
||||
Status : string
|
||||
}
|
||||
|
||||
/// Summary of a single visit to a gym.
|
||||
type Visit =
|
||||
{
|
||||
// Omitted Name because it always was null for me
|
||||
/// Whether the Duration field is estimated.
|
||||
IsDurationEstimated : bool
|
||||
/// When the visit began.
|
||||
StartTime : DateTime
|
||||
/// In minutes.
|
||||
Duration : int
|
||||
/// Which gym was visited
|
||||
Gym : VisitGym
|
||||
}
|
||||
|
||||
/// Human-readable non-round-trip representation.
|
||||
override this.ToString () =
|
||||
let startTime = this.StartTime.ToString "yyyy-MM-dd HH:mm"
|
||||
$"%s{this.Gym.Name}: %s{startTime} (%i{this.Duration} minutes)"
|
||||
|
||||
/// Aggregate statistics for gym visits across a time period.
|
||||
type SessionsSummary =
|
||||
{
|
||||
/// Aggregate stats for gym visits within the query-dependent time period.
|
||||
Total : SessionsAggregate
|
||||
/// Aggregate stats for gym visits "this week", whatever that means to PureGym.
|
||||
ThisWeek : SessionsAggregate
|
||||
}
|
||||
|
||||
/// Human-readable non-round-trip representation.
|
||||
override this.ToString () =
|
||||
$"%i{this.Total.Visits} visits, totalling %i{this.Total.Duration} minutes"
|
||||
|
||||
type Sessions =
|
||||
{
|
||||
Summary : SessionsSummary
|
||||
Visits : Visit list
|
||||
}
|
||||
|
||||
/// Human-readable non-round-trip representation.
|
||||
override this.ToString () =
|
||||
let summary = string<SessionsSummary> this.Summary
|
||||
let visits = this.Visits |> Seq.map string<Visit> |> String.concat "\n"
|
||||
|
||||
$"%s{summary}\n%s{visits}"
|
||||
|
||||
/// The PureGym REST API. You probably want to instantiate one of these with `Api.make`.
|
||||
[<Header("User-Agent", "PureGym/1523 CFNetwork/1312 Darwin/21.0.0")>]
|
||||
type IPureGymApi =
|
||||
/// Get the complete list of all gyms known to PureGym.
|
||||
[<Get "v1/gyms/">]
|
||||
abstract GetGyms : unit -> Task<Gym list>
|
||||
|
||||
/// Get information about the PureGym human whose credentials this client is authenticated with.
|
||||
[<Get "v1/member">]
|
||||
abstract GetMember : unit -> Task<Member>
|
||||
|
||||
/// Get information about how full the given gym currently is. The gym ID can be found from `GetGyms`.
|
||||
[<Get "v1/gyms/{gym_id}/attendance">]
|
||||
abstract GetGymAttendance : [<Path "gym_id">] gymId : int -> Task<GymAttendance>
|
||||
|
||||
/// Get information about a specific gym.
|
||||
[<Get "v1/gyms/{gym_id}">]
|
||||
abstract GetGym : [<Path "gym_id">] gymId : int -> Task<Gym>
|
||||
|
||||
/// Get information about the activities logged against the currently authenticated PureGym human.
|
||||
[<Get "v1/member/activity">]
|
||||
abstract GetMemberActivity : unit -> Task<MemberActivityDto>
|
||||
|
||||
/// Get information about the individual visits to all PureGyms the currently-authenticated PureGym human has made.
|
||||
[<Get "v2/gymSessions/member">]
|
||||
abstract GetSessions : [<Query>] fromDate : DateTime -> [<Query>] toDate : DateTime -> Task<Sessions>
|
||||
|
||||
// [<Get "v1/member/activity/history">]
|
||||
// abstract GetMemberActivityAll : unit -> Task<string>
|
||||
|
||||
/// Methods for interacting with the PureGym REST API.
|
||||
[<RequireQualifiedAccess>]
|
||||
@@ -377,5 +23,5 @@ module Api =
|
||||
|
||||
client.DefaultRequestHeaders.Add ("User-Agent", "PureGym/1523 CFNetwork/1312 Darwin/21.0.0")
|
||||
|
||||
return RestClient.For<IPureGymApi> client
|
||||
return PureGymApi.make client
|
||||
}
|
||||
|
39
PureGym/Client.fs
Normal file
39
PureGym/Client.fs
Normal file
@@ -0,0 +1,39 @@
|
||||
namespace PureGym
|
||||
|
||||
open System
|
||||
open System.Net.Http
|
||||
open System.Threading
|
||||
open System.Threading.Tasks
|
||||
open RestEase
|
||||
|
||||
/// The PureGym REST API. You probably want to instantiate one of these with `Api.make`.
|
||||
[<WoofWare.Myriad.Plugins.HttpClient>]
|
||||
[<Header("User-Agent", "PureGym/1523 CFNetwork/1312 Darwin/21.0.0")>]
|
||||
type IPureGymApi =
|
||||
/// Get the complete list of all gyms known to PureGym.
|
||||
[<Get "v1/gyms/">]
|
||||
abstract GetGyms : ?ct : CancellationToken -> Task<Gym list>
|
||||
|
||||
/// Get information about the PureGym human whose credentials this client is authenticated with.
|
||||
[<Get "v1/member">]
|
||||
abstract GetMember : ?ct : CancellationToken -> Task<Member>
|
||||
|
||||
/// Get information about how full the given gym currently is. The gym ID can be found from `GetGyms`.
|
||||
[<Get "v1/gyms/{gym_id}/attendance">]
|
||||
abstract GetGymAttendance : [<Path "gym_id">] gymId : int * ?ct : CancellationToken -> Task<GymAttendance>
|
||||
|
||||
/// Get information about a specific gym.
|
||||
[<Get "v1/gyms/{gym_id}">]
|
||||
abstract GetGym : [<Path "gym_id">] gymId : int * ?ct : CancellationToken -> Task<Gym>
|
||||
|
||||
/// Get information about the activities logged against the currently authenticated PureGym human.
|
||||
[<Get "v1/member/activity">]
|
||||
abstract GetMemberActivity : ?ct : CancellationToken -> Task<MemberActivityDto>
|
||||
|
||||
/// Get information about the individual visits to all PureGyms the currently-authenticated PureGym human has made.
|
||||
[<Get "v2/gymSessions/member">]
|
||||
abstract GetSessions :
|
||||
[<Query>] fromDate : DateOnly * [<Query>] toDate : DateOnly * ?ct : CancellationToken -> Task<Sessions>
|
||||
|
||||
// [<Get "v1/member/activity/history">]
|
||||
// abstract GetMemberActivityAll : ?ct: CancellationToken -> Task<string>
|
367
PureGym/Dto.fs
Normal file
367
PureGym/Dto.fs
Normal file
@@ -0,0 +1,367 @@
|
||||
namespace PureGym
|
||||
|
||||
open System
|
||||
open System.Text.Json.Serialization
|
||||
|
||||
/// Describes the opening hours of a given gym.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type GymOpeningHours =
|
||||
{
|
||||
/// If this is true, there should be no OpeningHours (but nothing enforces that).
|
||||
IsAlwaysOpen : bool
|
||||
/// This is a pretty unstructured list, which is in general not really parseable: it's human-readable only.
|
||||
OpeningHours : string list
|
||||
}
|
||||
|
||||
/// Human-readable representation
|
||||
override this.ToString () =
|
||||
if this.IsAlwaysOpen then
|
||||
"always open"
|
||||
else
|
||||
this.OpeningHours |> String.concat ", "
|
||||
|
||||
/// How a human can authenticate with a gym when they physically try to enter it
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type GymAccessOptions =
|
||||
{
|
||||
/// This gym has PIN entry pads
|
||||
PinAccess : bool
|
||||
/// This gym has a QR code scanner. QR codes can be generated with the PureGym app.
|
||||
QrCodeAccess : bool
|
||||
}
|
||||
|
||||
/// Human-readable representation
|
||||
override this.ToString () =
|
||||
$"Pin access: %c{Char.emoji this.PinAccess}; QR code access: %c{Char.emoji this.QrCodeAccess}"
|
||||
|
||||
/// Where a gym is on the Earth
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type GymLocation =
|
||||
{
|
||||
/// Measured in degrees
|
||||
[<JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)>]
|
||||
Longitude : float
|
||||
/// Measured in degrees
|
||||
[<JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)>]
|
||||
Latitude : float
|
||||
}
|
||||
|
||||
/// The postal address of a gym
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type GymAddress =
|
||||
{
|
||||
/// E.g. "Canterbury Court"
|
||||
[<JsonRequired>]
|
||||
AddressLine1 : string
|
||||
/// E.g. "Units 4, 4A, 5 And 5A"
|
||||
AddressLine2 : string option
|
||||
/// E.g. "Kennington Park"
|
||||
AddressLine3 : string option
|
||||
/// E.g. "LONDON"
|
||||
[<JsonRequired>]
|
||||
Town : string
|
||||
/// Never seen this in the wild, sorry
|
||||
County : string option
|
||||
/// E.g. "SW9 6DE"
|
||||
[<JsonRequired>]
|
||||
Postcode : string
|
||||
}
|
||||
|
||||
/// Human-readable statement of the address
|
||||
override this.ToString () =
|
||||
[
|
||||
yield Some this.AddressLine1
|
||||
yield this.AddressLine2
|
||||
yield this.AddressLine3
|
||||
match this.County with
|
||||
| None -> yield Some $"%s{this.Town} %s{this.Postcode}"
|
||||
| Some county ->
|
||||
yield Some this.Town
|
||||
yield Some $"%s{county} %s{this.Postcode}"
|
||||
]
|
||||
|> Seq.choose id
|
||||
|> String.concat "\n"
|
||||
|
||||
/// Metadata about a physical gym
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type Gym =
|
||||
{
|
||||
// The following fields are returned but are always null
|
||||
// ReasonsToJoin : string
|
||||
// VirtualTourUrl : Uri
|
||||
// PersonalTrainersUrl : Uri
|
||||
// WebViewUrl : Uri
|
||||
// FloorPlanUrl : Uri
|
||||
// StaffMembers : string
|
||||
|
||||
/// The name of this gym, e.g. "London Oval"
|
||||
[<JsonRequired>]
|
||||
Name : string
|
||||
/// This gym's ID in the PureGym system, e.g. 19
|
||||
[<JsonRequired>]
|
||||
Id : int
|
||||
/// I don't know what this status is. Please tell me if you know!
|
||||
[<JsonRequired>]
|
||||
Status : int
|
||||
/// Postal address of this gym
|
||||
[<JsonRequired>]
|
||||
Address : GymAddress
|
||||
/// Phone number of this gym, e.g. "+44 1234 567890"
|
||||
[<JsonRequired>]
|
||||
PhoneNumber : string
|
||||
/// Contact email address for this gym's staff
|
||||
[<JsonRequired>]
|
||||
EmailAddress : string
|
||||
/// When this gym is open
|
||||
[<JsonRequired>]
|
||||
GymOpeningHours : GymOpeningHours
|
||||
/// How a human can physically authenticate when they physically enter this gym
|
||||
[<JsonRequired>]
|
||||
AccessOptions : GymAccessOptions
|
||||
/// Where this gym is physically located
|
||||
[<JsonRequired>]
|
||||
Location : GymLocation
|
||||
/// The IANA time zone this gym observes, e.g. "Europe/London"
|
||||
[<JsonRequired>]
|
||||
TimeZone : string
|
||||
/// This is a date-time in the format yyyy-MM-ddTHH:mm:ss+01 Europe/London
|
||||
ReopenDate : string
|
||||
}
|
||||
|
||||
/// Human-readable representation of the most important information about this gym
|
||||
override this.ToString () =
|
||||
$"""%s{this.Name} (%i{this.Id})
|
||||
{this.Address}
|
||||
%s{this.EmailAddress} %s{this.PhoneNumber}
|
||||
Opening hours: %s{string<GymOpeningHours> this.GymOpeningHours}
|
||||
%s{string<GymAccessOptions> this.AccessOptions}
|
||||
"""
|
||||
|
||||
/// A human member of PureGym
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type Member =
|
||||
{
|
||||
/// This member's ID. This is a fairly large number.
|
||||
Id : int
|
||||
/// No idea what this is - please tell me if you know!
|
||||
CompoundMemberId : string
|
||||
/// First name, e.g. "Patrick"
|
||||
FirstName : string
|
||||
/// Last name, e.g. "Stevens"
|
||||
LastName : string
|
||||
/// ID of the gym designated as this user's home gym. This is also the "Id" field of the appropriate Gym object.
|
||||
HomeGymId : int
|
||||
/// The name of the gym designated as this user's home gym. This is also the "Name" field of the appropriate
|
||||
/// Gym object.
|
||||
HomeGymName : string
|
||||
/// This user's email address
|
||||
EmailAddress : string
|
||||
/// This user's gym access pin, probably 8 digits
|
||||
GymAccessPin : string
|
||||
/// This user's recorded date of birth
|
||||
[<JsonPropertyName "dateofBirth">]
|
||||
DateOfBirth : DateOnly
|
||||
/// This user's phone number, human-readable
|
||||
MobileNumber : string
|
||||
/// This user's registered home postcode
|
||||
[<JsonPropertyName "postCode">]
|
||||
Postcode : string
|
||||
/// E.g. "Corporate"
|
||||
MembershipName : string
|
||||
/// No idea what this is
|
||||
MembershipLevel : int
|
||||
/// No idea what this is
|
||||
SuspendedReason : int
|
||||
/// No idea what this is
|
||||
MemberStatus : int
|
||||
}
|
||||
|
||||
/// Statistics for how many people are currently at a gym
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type GymAttendance =
|
||||
{
|
||||
/// This appears always to be just equal to TotalPeopleInGym, but a string.
|
||||
[<JsonRequired>]
|
||||
Description : string
|
||||
/// How many people are in the gym as of this statistics snapshot
|
||||
[<JsonRequired>]
|
||||
TotalPeopleInGym : int
|
||||
/// How many people are in classes at the gym as of this statistics snapshot
|
||||
[<JsonRequired>]
|
||||
TotalPeopleInClasses : int
|
||||
/// E.g. " or fewer"
|
||||
TotalPeopleSuffix : string option
|
||||
/// Whether the number of people in the gym is approximate. This appears to become true when the number
|
||||
/// of people in the gym is small enough (e.g. in Oval the threshold is 10).
|
||||
[<JsonRequired>]
|
||||
IsApproximate : bool
|
||||
/// When the query was received (I think)
|
||||
AttendanceTime : DateTime
|
||||
/// When the "total people in gym" snapshot was taken that is reported here
|
||||
LastRefreshed : DateTime
|
||||
/// When the "number of people in classes" snapshot was taken that is reported here
|
||||
LastRefreshedPeopleInClasses : DateTime
|
||||
/// Maximum capacity of the gym, or 0 if no listed capacity
|
||||
MaximumCapacity : int
|
||||
}
|
||||
|
||||
/// Human-readable representation
|
||||
override this.ToString () =
|
||||
let totalPeopleSuffix =
|
||||
match this.TotalPeopleSuffix with
|
||||
| None -> ""
|
||||
| Some suffix -> suffix
|
||||
|
||||
let capacity =
|
||||
if this.MaximumCapacity = 0 then
|
||||
""
|
||||
else
|
||||
$" out of %i{this.MaximumCapacity} maximum"
|
||||
|
||||
let classes =
|
||||
if this.TotalPeopleInClasses = 0 then
|
||||
""
|
||||
else
|
||||
$"\n%i{this.TotalPeopleInClasses} in classes"
|
||||
|
||||
$"""%i{this.TotalPeopleInGym}%s{totalPeopleSuffix} in gym%s{capacity} (is exact: %c{Char.emoji (not this.IsApproximate)})%s{classes}
|
||||
Query made at %s{this.AttendanceTime.ToString "s"}%s{this.AttendanceTime.ToString "zzz"}
|
||||
Snapshot correct as of %s{this.LastRefreshed.ToString "s"}%s{this.LastRefreshed.ToString "zzz"}
|
||||
Classes info correct as of %s{this.LastRefreshedPeopleInClasses.ToString "s"}%s{this.LastRefreshedPeopleInClasses.ToString "zzz"}"""
|
||||
|
||||
/// The visit statistics for a particular human to a particular gym.
|
||||
/// The semantics of this class are basically unknown.
|
||||
type MemberActivityThisMonth =
|
||||
{
|
||||
/// How many minutes, including classes, have been logged so far this month
|
||||
TotalDurationMinutes : int
|
||||
/// How long, in minutes, each visit has been on average this month
|
||||
AverageDurationMinutes : int
|
||||
/// How many visits have been made this month, excluding classes
|
||||
TotalVisits : int
|
||||
/// How many classes have been attended this month
|
||||
TotalClasses : int
|
||||
/// Whether this block of statistics is estimated rather than exact
|
||||
IsEstimated : bool
|
||||
/// When this data was constructed
|
||||
LastRefreshed : DateTime
|
||||
}
|
||||
|
||||
/// Don't use this type. It's public because System.Text.Json can't do private types.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type MemberActivityDto =
|
||||
{
|
||||
[<JsonRequired>]
|
||||
TotalDuration : int
|
||||
[<JsonRequired>]
|
||||
AverageDuration : int
|
||||
[<JsonRequired>]
|
||||
TotalVisits : int
|
||||
[<JsonRequired>]
|
||||
TotalClasses : int
|
||||
[<JsonRequired>]
|
||||
IsEstimated : bool
|
||||
[<JsonRequired>]
|
||||
LastRefreshed : DateTime
|
||||
}
|
||||
|
||||
member this.ToMemberActivity () =
|
||||
{
|
||||
TotalDurationMinutes = this.TotalDuration
|
||||
AverageDurationMinutes = this.AverageDuration
|
||||
TotalVisits = this.TotalVisits
|
||||
TotalClasses = this.TotalClasses
|
||||
IsEstimated = this.IsEstimated
|
||||
LastRefreshed = this.LastRefreshed
|
||||
}
|
||||
|
||||
/// Aggregation of visits made to some particular gym in some defined time period.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type SessionsAggregate =
|
||||
{
|
||||
/// Number of gym "activities" within some query-defined time period; presumably this is like classes?
|
||||
/// It's always 0 for me.
|
||||
[<JsonPropertyName "Activities">]
|
||||
Activities : int
|
||||
/// Number of visits to the gym within some query-defined time period.
|
||||
[<JsonPropertyName "Visits">]
|
||||
Visits : int
|
||||
/// In minutes: total time spent in gym during the query-defined time period.
|
||||
[<JsonPropertyName "Duration">]
|
||||
Duration : int
|
||||
}
|
||||
|
||||
/// The DTO for gym info returned from the Sessions endpoint.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type VisitGym =
|
||||
{
|
||||
// Omitting Location, GymAccess, ContactInfo, TimeZone because these were all null for me
|
||||
/// The PureGym ID of this gym, e.g. 19
|
||||
[<JsonPropertyName "Id">]
|
||||
Id : int
|
||||
/// E.g. "London Oval", the canonical name of this gym
|
||||
[<JsonPropertyName "Name">]
|
||||
Name : string
|
||||
/// For some reason this always seems to be "Blocked"
|
||||
[<JsonPropertyName "Status">]
|
||||
Status : string
|
||||
}
|
||||
|
||||
/// Summary of a single visit to a gym.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type Visit =
|
||||
{
|
||||
// Omitted Name because it always was null for me
|
||||
/// Whether the Duration field is estimated.
|
||||
[<JsonPropertyName "IsDurationEstimated">]
|
||||
IsDurationEstimated : bool
|
||||
/// When the visit began.
|
||||
[<JsonPropertyName "StartTime">]
|
||||
StartTime : DateTime
|
||||
/// In minutes.
|
||||
[<JsonPropertyName "Duration">]
|
||||
Duration : int
|
||||
/// Which gym was visited
|
||||
[<JsonPropertyName "Gym">]
|
||||
Gym : VisitGym
|
||||
}
|
||||
|
||||
/// Human-readable non-round-trip representation.
|
||||
override this.ToString () =
|
||||
let startTime = this.StartTime.ToString "yyyy-MM-dd HH:mm"
|
||||
$"%s{this.Gym.Name}: %s{startTime} (%i{this.Duration} minutes)"
|
||||
|
||||
/// Aggregate statistics for gym visits across a time period.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type SessionsSummary =
|
||||
{
|
||||
/// Aggregate stats for gym visits within the query-dependent time period.
|
||||
[<JsonPropertyName "Total">]
|
||||
Total : SessionsAggregate
|
||||
/// Aggregate stats for gym visits "this week", whatever that means to PureGym.
|
||||
[<JsonPropertyName "ThisWeek">]
|
||||
ThisWeek : SessionsAggregate
|
||||
}
|
||||
|
||||
/// Human-readable non-round-trippable representation
|
||||
override this.ToString () =
|
||||
$"%i{this.Total.Visits} visits, totalling %i{this.Total.Duration} minutes"
|
||||
|
||||
/// Information about a particular user's visits to a particular gym.
|
||||
[<WoofWare.Myriad.Plugins.JsonParse>]
|
||||
type Sessions =
|
||||
{
|
||||
/// Aggregated summary over some time period.
|
||||
[<JsonPropertyName "Summary">]
|
||||
Summary : SessionsSummary
|
||||
/// List of all individual visits made within some time period.
|
||||
[<JsonPropertyName "Visits">]
|
||||
Visits : Visit list
|
||||
}
|
||||
|
||||
/// Human-readable non-round-trip representation.
|
||||
override this.ToString () =
|
||||
let summary = string<SessionsSummary> this.Summary
|
||||
let visits = this.Visits |> Seq.map string<Visit> |> String.concat "\n"
|
||||
|
||||
$"%s{summary}\n%s{visits}"
|
169
PureGym/GeneratedClient.fs
Normal file
169
PureGym/GeneratedClient.fs
Normal file
@@ -0,0 +1,169 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// This code was generated by myriad.
|
||||
// Changes to this file will be lost when the code is regenerated.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
namespace PureGym
|
||||
|
||||
open System
|
||||
open System.Net.Http
|
||||
open System.Threading
|
||||
open System.Threading.Tasks
|
||||
open RestEase
|
||||
|
||||
/// Module for constructing a REST client.
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
[<RequireQualifiedAccess>]
|
||||
module PureGymApi =
|
||||
/// Create a REST client.
|
||||
let make (client : System.Net.Http.HttpClient) : IPureGymApi =
|
||||
{ new IPureGymApi with
|
||||
member _.GetGyms (ct : CancellationToken option) =
|
||||
async {
|
||||
let! ct = Async.CancellationToken
|
||||
|
||||
let httpMessage =
|
||||
new System.Net.Http.HttpRequestMessage (
|
||||
Method = System.Net.Http.HttpMethod.Get,
|
||||
RequestUri = System.Uri (client.BaseAddress.ToString () + "/v1/gyms/")
|
||||
)
|
||||
|
||||
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||
let response = response.EnsureSuccessStatusCode ()
|
||||
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
|
||||
|
||||
let! node =
|
||||
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|
||||
|> Async.AwaitTask
|
||||
|
||||
return node.AsArray () |> Seq.map (fun elt -> Gym.jsonParse elt) |> List.ofSeq
|
||||
}
|
||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||
|
||||
member _.GetMember (ct : CancellationToken option) =
|
||||
async {
|
||||
let! ct = Async.CancellationToken
|
||||
|
||||
let httpMessage =
|
||||
new System.Net.Http.HttpRequestMessage (
|
||||
Method = System.Net.Http.HttpMethod.Get,
|
||||
RequestUri = System.Uri (client.BaseAddress.ToString () + "/v1/member")
|
||||
)
|
||||
|
||||
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||
let response = response.EnsureSuccessStatusCode ()
|
||||
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
|
||||
|
||||
let! node =
|
||||
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|
||||
|> Async.AwaitTask
|
||||
|
||||
return Member.jsonParse node
|
||||
}
|
||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||
|
||||
member _.GetGymAttendance (gymId : int, ct : CancellationToken option) =
|
||||
async {
|
||||
let! ct = Async.CancellationToken
|
||||
|
||||
let httpMessage =
|
||||
new System.Net.Http.HttpRequestMessage (
|
||||
Method = System.Net.Http.HttpMethod.Get,
|
||||
RequestUri =
|
||||
System.Uri (
|
||||
client.BaseAddress.ToString ()
|
||||
+ "/v1/gyms/{gym_id}/attendance".Replace ("{gym_id}", gymId.ToString ())
|
||||
)
|
||||
)
|
||||
|
||||
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||
let response = response.EnsureSuccessStatusCode ()
|
||||
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
|
||||
|
||||
let! node =
|
||||
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|
||||
|> Async.AwaitTask
|
||||
|
||||
return GymAttendance.jsonParse node
|
||||
}
|
||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||
|
||||
member _.GetGym (gymId : int, ct : CancellationToken option) =
|
||||
async {
|
||||
let! ct = Async.CancellationToken
|
||||
|
||||
let httpMessage =
|
||||
new System.Net.Http.HttpRequestMessage (
|
||||
Method = System.Net.Http.HttpMethod.Get,
|
||||
RequestUri =
|
||||
System.Uri (
|
||||
client.BaseAddress.ToString ()
|
||||
+ "/v1/gyms/{gym_id}".Replace ("{gym_id}", gymId.ToString ())
|
||||
)
|
||||
)
|
||||
|
||||
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||
let response = response.EnsureSuccessStatusCode ()
|
||||
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
|
||||
|
||||
let! node =
|
||||
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|
||||
|> Async.AwaitTask
|
||||
|
||||
return Gym.jsonParse node
|
||||
}
|
||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||
|
||||
member _.GetMemberActivity (ct : CancellationToken option) =
|
||||
async {
|
||||
let! ct = Async.CancellationToken
|
||||
|
||||
let httpMessage =
|
||||
new System.Net.Http.HttpRequestMessage (
|
||||
Method = System.Net.Http.HttpMethod.Get,
|
||||
RequestUri = System.Uri (client.BaseAddress.ToString () + "/v1/member/activity")
|
||||
)
|
||||
|
||||
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||
let response = response.EnsureSuccessStatusCode ()
|
||||
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
|
||||
|
||||
let! node =
|
||||
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|
||||
|> Async.AwaitTask
|
||||
|
||||
return MemberActivityDto.jsonParse node
|
||||
}
|
||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||
|
||||
member _.GetSessions (fromDate : DateOnly, toDate : DateOnly, ct : CancellationToken option) =
|
||||
async {
|
||||
let! ct = Async.CancellationToken
|
||||
|
||||
let httpMessage =
|
||||
new System.Net.Http.HttpRequestMessage (
|
||||
Method = System.Net.Http.HttpMethod.Get,
|
||||
RequestUri =
|
||||
System.Uri (
|
||||
client.BaseAddress.ToString ()
|
||||
+ ("/v2/gymSessions/member"
|
||||
+ "?fromDate="
|
||||
+ ((fromDate.ToString "yyyy-MM-dd") |> System.Web.HttpUtility.UrlEncode)
|
||||
+ "&toDate="
|
||||
+ ((toDate.ToString "yyyy-MM-dd") |> System.Web.HttpUtility.UrlEncode))
|
||||
)
|
||||
)
|
||||
|
||||
let! response = client.SendAsync (httpMessage, ct) |> Async.AwaitTask
|
||||
let response = response.EnsureSuccessStatusCode ()
|
||||
let! stream = response.Content.ReadAsStreamAsync ct |> Async.AwaitTask
|
||||
|
||||
let! node =
|
||||
System.Text.Json.Nodes.JsonNode.ParseAsync (stream, cancellationToken = ct)
|
||||
|> Async.AwaitTask
|
||||
|
||||
return Sessions.jsonParse node
|
||||
}
|
||||
|> (fun a -> Async.StartAsTask (a, ?cancellationToken = ct))
|
||||
}
|
350
PureGym/GeneratedDto.fs
Normal file
350
PureGym/GeneratedDto.fs
Normal file
@@ -0,0 +1,350 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// This code was generated by myriad.
|
||||
// Changes to this file will be lost when the code is regenerated.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the GymOpeningHours type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module GymOpeningHours =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : GymOpeningHours =
|
||||
let OpeningHours =
|
||||
node.["openingHours"].AsArray ()
|
||||
|> Seq.map (fun elt -> elt.AsValue().GetValue<string> ())
|
||||
|> List.ofSeq
|
||||
|
||||
let IsAlwaysOpen = node.["isAlwaysOpen"].AsValue().GetValue<bool> ()
|
||||
|
||||
{
|
||||
IsAlwaysOpen = IsAlwaysOpen
|
||||
OpeningHours = OpeningHours
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the GymAccessOptions type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module GymAccessOptions =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : GymAccessOptions =
|
||||
let QrCodeAccess = node.["qrCodeAccess"].AsValue().GetValue<bool> ()
|
||||
let PinAccess = node.["pinAccess"].AsValue().GetValue<bool> ()
|
||||
|
||||
{
|
||||
PinAccess = PinAccess
|
||||
QrCodeAccess = QrCodeAccess
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the GymLocation type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module GymLocation =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : GymLocation =
|
||||
let Latitude =
|
||||
try
|
||||
node.["latitude"].AsValue().GetValue<float> ()
|
||||
with :? System.InvalidOperationException as exc ->
|
||||
if exc.Message.Contains "cannot be converted to" then
|
||||
if
|
||||
System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString
|
||||
then
|
||||
node.["latitude"].AsValue().GetValue<string> () |> System.Double.Parse
|
||||
else
|
||||
reraise ()
|
||||
else
|
||||
reraise ()
|
||||
|
||||
let Longitude =
|
||||
try
|
||||
node.["longitude"].AsValue().GetValue<float> ()
|
||||
with :? System.InvalidOperationException as exc ->
|
||||
if exc.Message.Contains "cannot be converted to" then
|
||||
if
|
||||
System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString
|
||||
then
|
||||
node.["longitude"].AsValue().GetValue<string> () |> System.Double.Parse
|
||||
else
|
||||
reraise ()
|
||||
else
|
||||
reraise ()
|
||||
|
||||
{
|
||||
Longitude = Longitude
|
||||
Latitude = Latitude
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the GymAddress type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module GymAddress =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : GymAddress =
|
||||
let Postcode = node.["postcode"].AsValue().GetValue<string> ()
|
||||
|
||||
let County =
|
||||
match node.["county"] with
|
||||
| null -> None
|
||||
| v -> v.AsValue().GetValue<string> () |> Some
|
||||
|
||||
let Town = node.["town"].AsValue().GetValue<string> ()
|
||||
|
||||
let AddressLine3 =
|
||||
match node.["addressLine3"] with
|
||||
| null -> None
|
||||
| v -> v.AsValue().GetValue<string> () |> Some
|
||||
|
||||
let AddressLine2 =
|
||||
match node.["addressLine2"] with
|
||||
| null -> None
|
||||
| v -> v.AsValue().GetValue<string> () |> Some
|
||||
|
||||
let AddressLine1 = node.["addressLine1"].AsValue().GetValue<string> ()
|
||||
|
||||
{
|
||||
AddressLine1 = AddressLine1
|
||||
AddressLine2 = AddressLine2
|
||||
AddressLine3 = AddressLine3
|
||||
Town = Town
|
||||
County = County
|
||||
Postcode = Postcode
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the Gym type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module Gym =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : Gym =
|
||||
let ReopenDate = node.["reopenDate"].AsValue().GetValue<string> ()
|
||||
let TimeZone = node.["timeZone"].AsValue().GetValue<string> ()
|
||||
let Location = GymLocation.jsonParse node.["location"]
|
||||
let AccessOptions = GymAccessOptions.jsonParse node.["accessOptions"]
|
||||
let GymOpeningHours = GymOpeningHours.jsonParse node.["gymOpeningHours"]
|
||||
let EmailAddress = node.["emailAddress"].AsValue().GetValue<string> ()
|
||||
let PhoneNumber = node.["phoneNumber"].AsValue().GetValue<string> ()
|
||||
let Address = GymAddress.jsonParse node.["address"]
|
||||
let Status = node.["status"].AsValue().GetValue<int> ()
|
||||
let Id = node.["id"].AsValue().GetValue<int> ()
|
||||
let Name = node.["name"].AsValue().GetValue<string> ()
|
||||
|
||||
{
|
||||
Name = Name
|
||||
Id = Id
|
||||
Status = Status
|
||||
Address = Address
|
||||
PhoneNumber = PhoneNumber
|
||||
EmailAddress = EmailAddress
|
||||
GymOpeningHours = GymOpeningHours
|
||||
AccessOptions = AccessOptions
|
||||
Location = Location
|
||||
TimeZone = TimeZone
|
||||
ReopenDate = ReopenDate
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the Member type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module Member =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : Member =
|
||||
let MemberStatus = node.["memberStatus"].AsValue().GetValue<int> ()
|
||||
let SuspendedReason = node.["suspendedReason"].AsValue().GetValue<int> ()
|
||||
let MembershipLevel = node.["membershipLevel"].AsValue().GetValue<int> ()
|
||||
let MembershipName = node.["membershipName"].AsValue().GetValue<string> ()
|
||||
let Postcode = node.["postCode"].AsValue().GetValue<string> ()
|
||||
let MobileNumber = node.["mobileNumber"].AsValue().GetValue<string> ()
|
||||
|
||||
let DateOfBirth =
|
||||
node.["dateofBirth"].AsValue().GetValue<string> () |> System.DateOnly.Parse
|
||||
|
||||
let GymAccessPin = node.["gymAccessPin"].AsValue().GetValue<string> ()
|
||||
let EmailAddress = node.["emailAddress"].AsValue().GetValue<string> ()
|
||||
let HomeGymName = node.["homeGymName"].AsValue().GetValue<string> ()
|
||||
let HomeGymId = node.["homeGymId"].AsValue().GetValue<int> ()
|
||||
let LastName = node.["lastName"].AsValue().GetValue<string> ()
|
||||
let FirstName = node.["firstName"].AsValue().GetValue<string> ()
|
||||
let CompoundMemberId = node.["compoundMemberId"].AsValue().GetValue<string> ()
|
||||
let Id = node.["id"].AsValue().GetValue<int> ()
|
||||
|
||||
{
|
||||
Id = Id
|
||||
CompoundMemberId = CompoundMemberId
|
||||
FirstName = FirstName
|
||||
LastName = LastName
|
||||
HomeGymId = HomeGymId
|
||||
HomeGymName = HomeGymName
|
||||
EmailAddress = EmailAddress
|
||||
GymAccessPin = GymAccessPin
|
||||
DateOfBirth = DateOfBirth
|
||||
MobileNumber = MobileNumber
|
||||
Postcode = Postcode
|
||||
MembershipName = MembershipName
|
||||
MembershipLevel = MembershipLevel
|
||||
SuspendedReason = SuspendedReason
|
||||
MemberStatus = MemberStatus
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the GymAttendance type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module GymAttendance =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : GymAttendance =
|
||||
let MaximumCapacity = node.["maximumCapacity"].AsValue().GetValue<int> ()
|
||||
|
||||
let LastRefreshedPeopleInClasses =
|
||||
node.["lastRefreshedPeopleInClasses"].AsValue().GetValue<string> ()
|
||||
|> System.DateTime.Parse
|
||||
|
||||
let LastRefreshed =
|
||||
node.["lastRefreshed"].AsValue().GetValue<string> () |> System.DateTime.Parse
|
||||
|
||||
let AttendanceTime =
|
||||
node.["attendanceTime"].AsValue().GetValue<string> () |> System.DateTime.Parse
|
||||
|
||||
let IsApproximate = node.["isApproximate"].AsValue().GetValue<bool> ()
|
||||
|
||||
let TotalPeopleSuffix =
|
||||
match node.["totalPeopleSuffix"] with
|
||||
| null -> None
|
||||
| v -> v.AsValue().GetValue<string> () |> Some
|
||||
|
||||
let TotalPeopleInClasses = node.["totalPeopleInClasses"].AsValue().GetValue<int> ()
|
||||
let TotalPeopleInGym = node.["totalPeopleInGym"].AsValue().GetValue<int> ()
|
||||
let Description = node.["description"].AsValue().GetValue<string> ()
|
||||
|
||||
{
|
||||
Description = Description
|
||||
TotalPeopleInGym = TotalPeopleInGym
|
||||
TotalPeopleInClasses = TotalPeopleInClasses
|
||||
TotalPeopleSuffix = TotalPeopleSuffix
|
||||
IsApproximate = IsApproximate
|
||||
AttendanceTime = AttendanceTime
|
||||
LastRefreshed = LastRefreshed
|
||||
LastRefreshedPeopleInClasses = LastRefreshedPeopleInClasses
|
||||
MaximumCapacity = MaximumCapacity
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the MemberActivityDto type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module MemberActivityDto =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : MemberActivityDto =
|
||||
let LastRefreshed =
|
||||
node.["lastRefreshed"].AsValue().GetValue<string> () |> System.DateTime.Parse
|
||||
|
||||
let IsEstimated = node.["isEstimated"].AsValue().GetValue<bool> ()
|
||||
let TotalClasses = node.["totalClasses"].AsValue().GetValue<int> ()
|
||||
let TotalVisits = node.["totalVisits"].AsValue().GetValue<int> ()
|
||||
let AverageDuration = node.["averageDuration"].AsValue().GetValue<int> ()
|
||||
let TotalDuration = node.["totalDuration"].AsValue().GetValue<int> ()
|
||||
|
||||
{
|
||||
TotalDuration = TotalDuration
|
||||
AverageDuration = AverageDuration
|
||||
TotalVisits = TotalVisits
|
||||
TotalClasses = TotalClasses
|
||||
IsEstimated = IsEstimated
|
||||
LastRefreshed = LastRefreshed
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the SessionsAggregate type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module SessionsAggregate =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : SessionsAggregate =
|
||||
let Duration = node.["Duration"].AsValue().GetValue<int> ()
|
||||
let Visits = node.["Visits"].AsValue().GetValue<int> ()
|
||||
let Activities = node.["Activities"].AsValue().GetValue<int> ()
|
||||
|
||||
{
|
||||
Activities = Activities
|
||||
Visits = Visits
|
||||
Duration = Duration
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the VisitGym type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module VisitGym =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : VisitGym =
|
||||
let Status = node.["Status"].AsValue().GetValue<string> ()
|
||||
let Name = node.["Name"].AsValue().GetValue<string> ()
|
||||
let Id = node.["Id"].AsValue().GetValue<int> ()
|
||||
|
||||
{
|
||||
Id = Id
|
||||
Name = Name
|
||||
Status = Status
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the Visit type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module Visit =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : Visit =
|
||||
let Gym = VisitGym.jsonParse node.["Gym"]
|
||||
let Duration = node.["Duration"].AsValue().GetValue<int> ()
|
||||
|
||||
let StartTime =
|
||||
node.["StartTime"].AsValue().GetValue<string> () |> System.DateTime.Parse
|
||||
|
||||
let IsDurationEstimated = node.["IsDurationEstimated"].AsValue().GetValue<bool> ()
|
||||
|
||||
{
|
||||
IsDurationEstimated = IsDurationEstimated
|
||||
StartTime = StartTime
|
||||
Duration = Duration
|
||||
Gym = Gym
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the SessionsSummary type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module SessionsSummary =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : SessionsSummary =
|
||||
let ThisWeek = SessionsAggregate.jsonParse node.["ThisWeek"]
|
||||
let Total = SessionsAggregate.jsonParse node.["Total"]
|
||||
|
||||
{
|
||||
Total = Total
|
||||
ThisWeek = ThisWeek
|
||||
}
|
||||
namespace PureGym
|
||||
|
||||
/// Module containing JSON parsing methods for the Sessions type
|
||||
[<RequireQualifiedAccess>]
|
||||
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
|
||||
module Sessions =
|
||||
/// Parse from a JSON node.
|
||||
let jsonParse (node : System.Text.Json.Nodes.JsonNode) : Sessions =
|
||||
let Visits =
|
||||
node.["Visits"].AsArray ()
|
||||
|> Seq.map (fun elt -> Visit.jsonParse elt)
|
||||
|> List.ofSeq
|
||||
|
||||
let Summary = SessionsSummary.jsonParse node.["Summary"]
|
||||
|
||||
{
|
||||
Summary = Summary
|
||||
Visits = Visits
|
||||
}
|
@@ -3,22 +3,41 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<WarnOn>FS3559</WarnOn>
|
||||
|
||||
<WoofWareMyriadPluginVersion>1.1.1</WoofWareMyriadPluginVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="String.fs" />
|
||||
<Compile Include="Auth.fs" />
|
||||
<Compile Include="Api.fs" />
|
||||
<Compile Include="GymSelector.fs" />
|
||||
<EmbeddedResource Include="SurfaceBaseline.txt" />
|
||||
<EmbeddedResource Include="version.json" />
|
||||
<Compile Include="String.fs" />
|
||||
<Compile Include="Auth.fs" />
|
||||
<Compile Include="Dto.fs" />
|
||||
<Compile Include="GeneratedDto.fs"> <!--1-->
|
||||
<MyriadFile>Dto.fs</MyriadFile> <!--2-->
|
||||
</Compile>
|
||||
<Compile Include="Client.fs" />
|
||||
<Compile Include="GeneratedClient.fs">
|
||||
<MyriadFile>Client.fs</MyriadFile> <!--2-->
|
||||
</Compile>
|
||||
<Compile Include="Api.fs" />
|
||||
<Compile Include="GymSelector.fs" />
|
||||
<EmbeddedResource Include="SurfaceBaseline.txt" />
|
||||
<EmbeddedResource Include="version.json" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<MyriadSdkGenerator Include="$(NuGetPackageRoot)/woofware.myriad.plugins/$(WoofWareMyriadPluginVersion)/lib/net6.0/WoofWare.Myriad.Plugins.dll" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="RestEase" Version="1.6.4" />
|
||||
<PackageReference Update="FSharp.Core" Version="6.0.0" />
|
||||
<PackageReference Include="System.Text.Json" Version="7.0.3" />
|
||||
<PackageReference Update="FSharp.Core" Version="6.0.1" />
|
||||
<PackageReference Include="System.Text.Json" Version="8.0.0" />
|
||||
<PackageReference Include="Fastenshtein" Version="1.0.0.8" />
|
||||
<PackageReference Include="Myriad.Core" Version="0.8.3" />
|
||||
<PackageReference Include="Myriad.Sdk" Version="0.8.3" />
|
||||
<PackageReference Include="WoofWare.Myriad.Plugins" Version="$(WoofWareMyriadPluginVersion)" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@@ -1,5 +1,3 @@
|
||||
PureGym.Api inherit obj
|
||||
PureGym.Api.make [static method]: PureGym.Auth -> PureGym.IPureGymApi System.Threading.Tasks.Task
|
||||
PureGym.Auth inherit obj, implements PureGym.Auth System.IEquatable, System.Collections.IStructuralEquatable, PureGym.Auth System.IComparable, System.IComparable, System.Collections.IStructuralComparable - union type with 2 cases
|
||||
PureGym.Auth+Tags inherit obj
|
||||
PureGym.Auth+Tags.Token [static field]: int = 1
|
||||
@@ -37,6 +35,8 @@ PureGym.AuthToken.get_ExpiryTime [method]: unit -> System.DateTime option
|
||||
PureGym.AuthTokenModule inherit obj
|
||||
PureGym.AuthTokenModule.get [static method]: PureGym.UsernamePin -> PureGym.AuthToken System.Threading.Tasks.Task
|
||||
PureGym.AuthTokenModule.ofBearerToken [static method]: string -> PureGym.AuthToken
|
||||
PureGym.Api inherit obj
|
||||
PureGym.Api.make [static method]: PureGym.Auth -> PureGym.IPureGymApi System.Threading.Tasks.Task
|
||||
PureGym.Gym inherit obj, implements PureGym.Gym System.IEquatable, System.Collections.IStructuralEquatable, PureGym.Gym System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.Gym..ctor [constructor]: (string, int, int, PureGym.GymAddress, string, string, PureGym.GymOpeningHours, PureGym.GymAccessOptions, PureGym.GymLocation, string, string)
|
||||
PureGym.Gym.AccessOptions [property]: [read-only] PureGym.GymAccessOptions
|
||||
@@ -67,22 +67,26 @@ PureGym.GymAccessOptions.get_PinAccess [method]: unit -> bool
|
||||
PureGym.GymAccessOptions.get_QrCodeAccess [method]: unit -> bool
|
||||
PureGym.GymAccessOptions.PinAccess [property]: [read-only] bool
|
||||
PureGym.GymAccessOptions.QrCodeAccess [property]: [read-only] bool
|
||||
PureGym.GymAccessOptionsModule inherit obj
|
||||
PureGym.GymAccessOptionsModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.GymAccessOptions
|
||||
PureGym.GymAddress inherit obj, implements PureGym.GymAddress System.IEquatable, System.Collections.IStructuralEquatable, PureGym.GymAddress System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.GymAddress..ctor [constructor]: (string, string, string, string, string, string)
|
||||
PureGym.GymAddress..ctor [constructor]: (string, string option, string option, string, string option, string)
|
||||
PureGym.GymAddress.AddressLine1 [property]: [read-only] string
|
||||
PureGym.GymAddress.AddressLine2 [property]: [read-only] string
|
||||
PureGym.GymAddress.AddressLine3 [property]: [read-only] string
|
||||
PureGym.GymAddress.County [property]: [read-only] string
|
||||
PureGym.GymAddress.AddressLine2 [property]: [read-only] string option
|
||||
PureGym.GymAddress.AddressLine3 [property]: [read-only] string option
|
||||
PureGym.GymAddress.County [property]: [read-only] string option
|
||||
PureGym.GymAddress.get_AddressLine1 [method]: unit -> string
|
||||
PureGym.GymAddress.get_AddressLine2 [method]: unit -> string
|
||||
PureGym.GymAddress.get_AddressLine3 [method]: unit -> string
|
||||
PureGym.GymAddress.get_County [method]: unit -> string
|
||||
PureGym.GymAddress.get_AddressLine2 [method]: unit -> string option
|
||||
PureGym.GymAddress.get_AddressLine3 [method]: unit -> string option
|
||||
PureGym.GymAddress.get_County [method]: unit -> string option
|
||||
PureGym.GymAddress.get_Postcode [method]: unit -> string
|
||||
PureGym.GymAddress.get_Town [method]: unit -> string
|
||||
PureGym.GymAddress.Postcode [property]: [read-only] string
|
||||
PureGym.GymAddress.Town [property]: [read-only] string
|
||||
PureGym.GymAddressModule inherit obj
|
||||
PureGym.GymAddressModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.GymAddress
|
||||
PureGym.GymAttendance inherit obj, implements PureGym.GymAttendance System.IEquatable, System.Collections.IStructuralEquatable, PureGym.GymAttendance System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.GymAttendance..ctor [constructor]: (string, int, int, string, bool, System.DateTime, System.DateTime, System.DateTime, int)
|
||||
PureGym.GymAttendance..ctor [constructor]: (string, int, int, string option, bool, System.DateTime, System.DateTime, System.DateTime, int)
|
||||
PureGym.GymAttendance.AttendanceTime [property]: [read-only] System.DateTime
|
||||
PureGym.GymAttendance.Description [property]: [read-only] string
|
||||
PureGym.GymAttendance.get_AttendanceTime [method]: unit -> System.DateTime
|
||||
@@ -93,26 +97,34 @@ PureGym.GymAttendance.get_LastRefreshedPeopleInClasses [method]: unit -> System.
|
||||
PureGym.GymAttendance.get_MaximumCapacity [method]: unit -> int
|
||||
PureGym.GymAttendance.get_TotalPeopleInClasses [method]: unit -> int
|
||||
PureGym.GymAttendance.get_TotalPeopleInGym [method]: unit -> int
|
||||
PureGym.GymAttendance.get_TotalPeopleSuffix [method]: unit -> string
|
||||
PureGym.GymAttendance.get_TotalPeopleSuffix [method]: unit -> string option
|
||||
PureGym.GymAttendance.IsApproximate [property]: [read-only] bool
|
||||
PureGym.GymAttendance.LastRefreshed [property]: [read-only] System.DateTime
|
||||
PureGym.GymAttendance.LastRefreshedPeopleInClasses [property]: [read-only] System.DateTime
|
||||
PureGym.GymAttendance.MaximumCapacity [property]: [read-only] int
|
||||
PureGym.GymAttendance.TotalPeopleInClasses [property]: [read-only] int
|
||||
PureGym.GymAttendance.TotalPeopleInGym [property]: [read-only] int
|
||||
PureGym.GymAttendance.TotalPeopleSuffix [property]: [read-only] string
|
||||
PureGym.GymAttendance.TotalPeopleSuffix [property]: [read-only] string option
|
||||
PureGym.GymAttendanceModule inherit obj
|
||||
PureGym.GymAttendanceModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.GymAttendance
|
||||
PureGym.GymLocation inherit obj, implements PureGym.GymLocation System.IEquatable, System.Collections.IStructuralEquatable, PureGym.GymLocation System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.GymLocation..ctor [constructor]: (float, float)
|
||||
PureGym.GymLocation.get_Latitude [method]: unit -> float
|
||||
PureGym.GymLocation.get_Longitude [method]: unit -> float
|
||||
PureGym.GymLocation.Latitude [property]: [read-only] float
|
||||
PureGym.GymLocation.Longitude [property]: [read-only] float
|
||||
PureGym.GymLocationModule inherit obj
|
||||
PureGym.GymLocationModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.GymLocation
|
||||
PureGym.GymModule inherit obj
|
||||
PureGym.GymModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.Gym
|
||||
PureGym.GymOpeningHours inherit obj, implements PureGym.GymOpeningHours System.IEquatable, System.Collections.IStructuralEquatable, PureGym.GymOpeningHours System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.GymOpeningHours..ctor [constructor]: (bool, string list)
|
||||
PureGym.GymOpeningHours.get_IsAlwaysOpen [method]: unit -> bool
|
||||
PureGym.GymOpeningHours.get_OpeningHours [method]: unit -> string list
|
||||
PureGym.GymOpeningHours.IsAlwaysOpen [property]: [read-only] bool
|
||||
PureGym.GymOpeningHours.OpeningHours [property]: [read-only] string list
|
||||
PureGym.GymOpeningHoursModule inherit obj
|
||||
PureGym.GymOpeningHoursModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.GymOpeningHours
|
||||
PureGym.GymSelector inherit obj, implements PureGym.GymSelector System.IEquatable, System.Collections.IStructuralEquatable, PureGym.GymSelector System.IComparable, System.IComparable, System.Collections.IStructuralComparable - union type with 3 cases
|
||||
PureGym.GymSelector+Id inherit PureGym.GymSelector
|
||||
PureGym.GymSelector+Id.get_Item [method]: unit -> int
|
||||
@@ -139,12 +151,12 @@ PureGym.GymSelector.Tag [property]: [read-only] int
|
||||
PureGym.GymSelectorModule inherit obj
|
||||
PureGym.GymSelectorModule.canonicalId [static method]: PureGym.IPureGymApi -> PureGym.GymSelector -> int System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi - interface with 6 member(s)
|
||||
PureGym.IPureGymApi.GetGym [method]: int -> PureGym.Gym System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetGymAttendance [method]: int -> PureGym.GymAttendance System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetGyms [method]: unit -> PureGym.Gym list System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetMember [method]: unit -> PureGym.Member System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetMemberActivity [method]: unit -> PureGym.MemberActivityDto System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetSessions [method]: System.DateTime -> System.DateTime -> PureGym.Sessions System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetGym [method]: (int, System.Threading.CancellationToken option) -> PureGym.Gym System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetGymAttendance [method]: (int, System.Threading.CancellationToken option) -> PureGym.GymAttendance System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetGyms [method]: System.Threading.CancellationToken option -> PureGym.Gym list System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetMember [method]: System.Threading.CancellationToken option -> PureGym.Member System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetMemberActivity [method]: System.Threading.CancellationToken option -> PureGym.MemberActivityDto System.Threading.Tasks.Task
|
||||
PureGym.IPureGymApi.GetSessions [method]: (System.DateOnly, System.DateOnly, System.Threading.CancellationToken option) -> PureGym.Sessions System.Threading.Tasks.Task
|
||||
PureGym.Member inherit obj, implements PureGym.Member System.IEquatable, System.Collections.IStructuralEquatable, PureGym.Member System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.Member..ctor [constructor]: (int, string, string, string, int, string, string, string, System.DateOnly, string, string, string, int, int, int)
|
||||
PureGym.Member.CompoundMemberId [property]: [read-only] string
|
||||
@@ -192,6 +204,8 @@ PureGym.MemberActivityDto.ToMemberActivity [method]: unit -> PureGym.MemberActiv
|
||||
PureGym.MemberActivityDto.TotalClasses [property]: [read-only] int
|
||||
PureGym.MemberActivityDto.TotalDuration [property]: [read-only] int
|
||||
PureGym.MemberActivityDto.TotalVisits [property]: [read-only] int
|
||||
PureGym.MemberActivityDtoModule inherit obj
|
||||
PureGym.MemberActivityDtoModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.MemberActivityDto
|
||||
PureGym.MemberActivityThisMonth inherit obj, implements PureGym.MemberActivityThisMonth System.IEquatable, System.Collections.IStructuralEquatable, PureGym.MemberActivityThisMonth System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.MemberActivityThisMonth..ctor [constructor]: (int, int, int, int, bool, System.DateTime)
|
||||
PureGym.MemberActivityThisMonth.AverageDurationMinutes [property]: [read-only] int
|
||||
@@ -206,6 +220,10 @@ PureGym.MemberActivityThisMonth.LastRefreshed [property]: [read-only] System.Dat
|
||||
PureGym.MemberActivityThisMonth.TotalClasses [property]: [read-only] int
|
||||
PureGym.MemberActivityThisMonth.TotalDurationMinutes [property]: [read-only] int
|
||||
PureGym.MemberActivityThisMonth.TotalVisits [property]: [read-only] int
|
||||
PureGym.MemberModule inherit obj
|
||||
PureGym.MemberModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.Member
|
||||
PureGym.PureGymApiModule inherit obj
|
||||
PureGym.PureGymApiModule.make [static method]: System.Net.Http.HttpClient -> PureGym.IPureGymApi
|
||||
PureGym.Sessions inherit obj, implements PureGym.Sessions System.IEquatable, System.Collections.IStructuralEquatable, PureGym.Sessions System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.Sessions..ctor [constructor]: (PureGym.SessionsSummary, PureGym.Visit list)
|
||||
PureGym.Sessions.get_Summary [method]: unit -> PureGym.SessionsSummary
|
||||
@@ -220,12 +238,18 @@ PureGym.SessionsAggregate.get_Activities [method]: unit -> int
|
||||
PureGym.SessionsAggregate.get_Duration [method]: unit -> int
|
||||
PureGym.SessionsAggregate.get_Visits [method]: unit -> int
|
||||
PureGym.SessionsAggregate.Visits [property]: [read-only] int
|
||||
PureGym.SessionsAggregateModule inherit obj
|
||||
PureGym.SessionsAggregateModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.SessionsAggregate
|
||||
PureGym.SessionsModule inherit obj
|
||||
PureGym.SessionsModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.Sessions
|
||||
PureGym.SessionsSummary inherit obj, implements PureGym.SessionsSummary System.IEquatable, System.Collections.IStructuralEquatable, PureGym.SessionsSummary System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.SessionsSummary..ctor [constructor]: (PureGym.SessionsAggregate, PureGym.SessionsAggregate)
|
||||
PureGym.SessionsSummary.get_ThisWeek [method]: unit -> PureGym.SessionsAggregate
|
||||
PureGym.SessionsSummary.get_Total [method]: unit -> PureGym.SessionsAggregate
|
||||
PureGym.SessionsSummary.ThisWeek [property]: [read-only] PureGym.SessionsAggregate
|
||||
PureGym.SessionsSummary.Total [property]: [read-only] PureGym.SessionsAggregate
|
||||
PureGym.SessionsSummaryModule inherit obj
|
||||
PureGym.SessionsSummaryModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.SessionsSummary
|
||||
PureGym.UsernamePin inherit obj, implements PureGym.UsernamePin System.IEquatable, System.Collections.IStructuralEquatable, PureGym.UsernamePin System.IComparable, System.IComparable, System.Collections.IStructuralComparable
|
||||
PureGym.UsernamePin..ctor [constructor]: (string, string)
|
||||
PureGym.UsernamePin.get_Pin [method]: unit -> string
|
||||
@@ -249,4 +273,8 @@ PureGym.VisitGym.get_Name [method]: unit -> string
|
||||
PureGym.VisitGym.get_Status [method]: unit -> string
|
||||
PureGym.VisitGym.Id [property]: [read-only] int
|
||||
PureGym.VisitGym.Name [property]: [read-only] string
|
||||
PureGym.VisitGym.Status [property]: [read-only] string
|
||||
PureGym.VisitGym.Status [property]: [read-only] string
|
||||
PureGym.VisitGymModule inherit obj
|
||||
PureGym.VisitGymModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.VisitGym
|
||||
PureGym.VisitModule inherit obj
|
||||
PureGym.VisitModule.jsonParse [static method]: System.Text.Json.Nodes.JsonNode -> PureGym.Visit
|
||||
|
0
PureGym/myriad.toml
Normal file
0
PureGym/myriad.toml
Normal file
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "2.0",
|
||||
"version": "3.0",
|
||||
"publicReleaseRefSpec": [
|
||||
"^refs/heads/main$"
|
||||
],
|
||||
|
Reference in New Issue
Block a user