コード例 #1
0
        internal static IQueryable <SarEvent> GetActiveEvents(IMissionLineDbContext db, IConfigSource config)
        {
            IQueryable <SarEvent> query  = db.Events;
            DateTimeOffset        cutoff = DateTimeOffset.UtcNow.AddDays(-2).ToOrgTime(config);

            query = query.Where(f => f.Closed == null || f.Closed > cutoff);
            return(query.OrderByDescending(f => f.Opened));
        }
コード例 #2
0
 internal static EventEntry GetEventEntry(int id, IMissionLineDbContext db)
 {
     return(db.Events.Where(f => f.Id == id)
            .Select(proj)
            .SingleOrDefault());
 }
コード例 #3
0
 internal async static Task <CallEntry> GetCallEntry(int id, IMissionLineDbContext db)
 {
     return(await db.Calls.Where(f => f.Id == id)
            .Select(proj)
            .SingleOrDefaultAsync());
 }
コード例 #4
0
        //[HttpPost]
        //[Route("api/roster/{rosterId}/signout")]
        //public async Task<SubmitResult> Signout(int rosterId, DateTime when, int? miles)
        //{
        //  var result = new SubmitResult();
        //  using (var db = dbFactory())
        //  {
        //    var roster = db.SignIns.SingleOrDefault(f => f.Id == rosterId);
        //    if (roster == null)
        //    {
        //      result.Errors.Add(new SubmitError("Roster entry not found"));
        //    }
        //    else
        //    {
        //      roster.TimeOut = when;
        //      roster.Miles = miles;
        //      await AssignInternal(roster, roster.EventId, db, config);
        //    }
        //  }
        //  return result;
        //}

        //[HttpPost]
        //[Route("api/roster/{rosterId}/undoSignout")]
        //public async Task<SubmitResult> UndoSignout(int rosterId)
        //{
        //  var result = new SubmitResult();
        //  using (var db = dbFactory())
        //  {
        //    var roster = db.SignIns.SingleOrDefault(f => f.Id == rosterId);
        //    if (roster == null)
        //    {
        //      result.Errors.Add(new SubmitError("Roster entry not found"));
        //    }
        //    else
        //    {
        //      roster.TimeOut = null;
        //      await AssignInternal(roster, roster.EventId, db, config);
        //    }
        //  }
        //  return result;
        //}

        internal static RosterEntry GetRosterEntry(int id, IMissionLineDbContext db)
        {
            return(db.SignIns.Where(f => f.Id == id)
                   .Select(proj)
                   .SingleOrDefault());
        }
コード例 #5
0
        private static MemberSignIn SplitSignin(int?eventId, MemberSignIn outer, MemberSignIn inner, IMissionLineDbContext db, IConfigSource config)
        {
            MemberSignIn front = new MemberSignIn
            {
                EventId  = eventId,
                isMember = outer.isMember,
                MemberId = outer.MemberId,
                Name     = outer.Name,
                TimeIn   = outer.TimeIn,
                TimeOut  = inner.TimeIn
            };

            db.SignIns.Add(front);
            outer.TimeIn = inner.TimeOut ?? DateTimeOffset.UtcNow.ToOrgTime(config);
            return(front);
        }
コード例 #6
0
        internal static async Task <SubmitResult> AssignInternal(MemberSignIn signin, int?eventId, IMissionLineDbContext db, IConfigSource config)
        {
            var result        = new SubmitResult();
            var notifications = new List <Action>();
            var hub           = config.GetPushHub <CallsHub>();

            var exposedSignin = await db.SignIns
                                .Where(f => f.MemberId == signin.MemberId && f.EventId == signin.EventId && f.Id != signin.Id)
                                .OrderByDescending(f => f.TimeIn)
                                .FirstOrDefaultAsync();

            if (exposedSignin != null)
            {
                notifications.Add(() => hub.updatedRoster(compiledProj(exposedSignin), true));
            }

            var            others           = db.SignIns.Where(f => f.EventId == eventId && f.MemberId == signin.MemberId && f.Id != signin.Id).OrderBy(f => f.TimeIn).ToList();
            DateTimeOffset effectiveTimeOut = signin.TimeOut ?? DateTimeOffset.MaxValue;
            bool           rosterisLatest   = true;

            foreach (var other in others)
            {
                var otherTimeOut = other.TimeOut ?? DateTimeOffset.MaxValue;
                // R: [---------->
                // O:      [----------]

                // R: [---------->
                // O:       [-------->

                // R: [----------]
                // O:         [----->

                // R: [--------------------]
                // O:       [-------]

                // R: [---------]
                // O:     [--->

                // R: [------]
                // O:    [------]

                // R: [---]
                // O:       [----]

                // R:      [-----]
                // O:   [-----]

                // R:        [---]
                // O: [---]



                // Trim signins that overlap our time in.
                if (signin.TimeIn <= other.TimeIn)
                {
                    if (effectiveTimeOut >= other.TimeIn && effectiveTimeOut <= otherTimeOut)
                    {
                        // roster is before the other one. It is not the latest
                        rosterisLatest = false;
                        notifications.Add(() => hub.updatedRoster(compiledProj(other), true));
                        signin.TimeOut = other.TimeIn;
                    }
                    else if (effectiveTimeOut > otherTimeOut)
                    {
                        // split roster around other.
                        // roster is the most recent, other and front are not.
                        var front = SplitSignin(eventId, signin, other, db, config);
                        notifications.Add(() => hub.updatedRoster(compiledProj(front), false));
                        notifications.Add(() => hub.updatedRoster(compiledProj(other), false));
                    }
                }
                else
                {
                    if (otherTimeOut > signin.TimeIn && otherTimeOut <= effectiveTimeOut)
                    {
                        // other overlaps on the early side
                        other.TimeOut = signin.TimeIn;
                        notifications.Add(() => hub.updatedRoster(compiledProj(other), false));
                    }
                    else if (otherTimeOut > effectiveTimeOut)
                    {
                        //split other around roster
                        var front = SplitSignin(eventId, other, signin, db, config);
                        notifications.Add(() => hub.updatedRoster(compiledProj(front), false));
                        notifications.Add(() => hub.updatedRoster(compiledProj(other), true));
                        rosterisLatest = false;
                    }
                    else if (otherTimeOut < signin.TimeIn)
                    {
                        // other notification is not the latest.
                        notifications.Add(() => hub.updatedRoster(compiledProj(other), false));
                    }
                }
            }

            signin.EventId = eventId;
            notifications.Add(() => hub.updatedRoster(compiledProj(signin), rosterisLatest));
            db.SaveChanges();
            foreach (var notify in notifications)
            {
                notify();
            }

            return(result);
        }
コード例 #7
0
        // =========================================  END PUBLIC METHODS  =============================================

        private Task <MemberSignIn> GetMembersLatestSignin(IMissionLineDbContext db, string memberId)
        {
            return(db.SignIns.OrderByDescending(f => f.TimeIn).FirstOrDefaultAsync(f => f.MemberId == memberId));
        }