public AppQuery(
            IRoleRepository roleRepository,
            IAirportRepository airportRepository,
            IUserRepository userRepository,
            IDashboardRepository dashboardRepository,
            IDotNetProvider dotNetProvider,
            IHttpContextAccessor httpContextAccessor)
        {
            _roleRepository      = roleRepository;
            _airportRepository   = airportRepository;
            _userRepository      = userRepository;
            _dashboardRepository = dashboardRepository;
            _dotNetProvider      = dotNetProvider;
            _httpContextAccessor = httpContextAccessor;

            Field <HealthCheckGraphType>("healthcheck",
                                         description: "Information about the status of the GraphQL API.",
                                         resolve: context => { return(new Healthcheck("1.0.0", _dotNetProvider.DateTimeNow)); }
                                         );

            Field <ListGraphType <RoleGraphType> >("roles",
                                                   description: "Configuration: Roles available in the application.",
                                                   resolve: context => { return(_roleRepository.GetAllRolesAsync().Result); }
                                                   );

            Field <ListGraphType <AirportGraphType> >("airports",
                                                      description: "A list of airport codes and names.",
                                                      resolve: context => { return(_airportRepository.GetAirports()); });

            Field <AirportGraphType>("airport",
                                     description: "Information about a specific airport.",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <IdGraphType> > {
                Name = "code", Description = "The airport code."
            }
                                         ),
                                     resolve: context =>
            {
                string codeArgument = context.GetArgument <string>("code");
                return(_airportRepository.GetAirport(codeArgument));
            });

            Field <ListGraphType <UserGraphType> >("users",
                                                   description: "The users in the application.",
                                                   resolve: context => { return(_userRepository.GetAllUsersAsync().Result); });

//            Field<UserGraphType>("user",
//                description: "Information about a specific user.",
//                arguments: new QueryArguments(
//                    new QueryArgument<NonNullGraphType<IdGraphType>> {Name = "userId", Description = "The User ID."}
//                ),
//                resolve: context =>
//                {
//                    string userIdArgument = context.GetArgument<string>("userId");
//                    return _userRepository.GetUserByUserIdAsync(userIdArgument);
//                });

            Field <AccrualGraphType>("accrual",
                                     description: "",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <IdGraphType> >
            {
                Name = "accrualId", Description = "The Accrual ID."
            }
                                         ),
                                     resolve: context =>
            {
                string userId            = _httpContextAccessor.HttpContext.User.UserId();
                string accrualIdArgument = context.GetArgument <string>("accrualId");
                Guid.TryParse(accrualIdArgument, out var id);
                return(_dashboardRepository.GetAccrualForUserByAccrualIdAsync(userId, id));
            });
        }
Example #2
0
        public AppMutation(
            IAirportRepository airportRepository,
            IDashboardRepository dashboardRepository,
            IHttpContextAccessor httpContextAccessor,
            IDotNetProvider dotNetProvider)
        {
            _airportRepository   = airportRepository;
            _dashboardRepository = dashboardRepository;
            _httpContextAccessor = httpContextAccessor;
            _dotNetProvider      = dotNetProvider;

            Field <AirportGraphType>("addAirport", "",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <AirportInputType> >
            {
                Name = "airport", Description = "The airport to add."
            }
                                         ),
                                     resolve: context =>
            {
                AirportInput airport = context.GetArgument <AirportInput>("airport");
                Airport a            = _airportRepository.GetAirport(airport.Code);
                if (a == null)
                {
                    _airportRepository.AddAirport(airport);

                    return(_airportRepository.GetAirport(airport.Code));
                }

                return(a);
            });

            Field <AccrualGraphType>("addAccrualAction", "",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <IdGraphType> >
            {
                Name = "accrualId", Description = "The accrual to modify."
            },
                                         new QueryArgument <NonNullGraphType <AccrualActionRecordInputType> >
            {
                Name = "action", Description = "The action to add."
            }
                                         ),
                                     resolve: context =>
            {
                AccrualActionRecordInput input = context.GetArgument <AccrualActionRecordInput>("action");

                if (AccrualActionRecordValidator.TryValidate(input, out var errors))
                {
                    string accrualIdArgument = context.GetArgument <string>("accrualId");
                    Guid.TryParse(accrualIdArgument, out var id);
                    string userId = _httpContextAccessor.HttpContext.User.UserId();

                    var action = new AccrualActionRecord(_dotNetProvider.NewGuid.ToString(), input.AccrualAction,
                                                         input.ActionDate, input.Amount,
                                                         input.Note, _dotNetProvider.DateTimeNow);

                    bool added = _dashboardRepository.AddActionForAccrualAsync(userId, id, action).Result;
                    if (added)
                    {
                        return(_dashboardRepository.GetAccrualForUserByAccrualIdAsync(userId, id));
                    }

                    context.Errors.Add(new ExecutionError("Error adding new accrual."));
                    return(null);
                }

                context.Errors.Add(new ExecutionError(string.Join(Environment.NewLine, errors)));
                return(null);
            });

            Field <AccrualGraphType>("deleteAccrualAction", "",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <IdGraphType> >
            {
                Name = "accrualId", Description = "The accrual to modify."
            },
                                         new QueryArgument <NonNullGraphType <StringGraphType> >
            {
                Name = "accrualActionId", Description = "The action to remove."
            }
                                         ),
                                     resolve: context =>
            {
                string accrualIdArgument       = context.GetArgument <string>("accrualId");
                string accrualActionIdArgument = context.GetArgument <string>("accrualActionId");

                Guid.TryParse(accrualIdArgument, out var accrualId);
                Guid.TryParse(accrualActionIdArgument, out var accrualActionId);
                string userId = _httpContextAccessor.HttpContext.User.UserId();

                bool removed = _dashboardRepository.DeleteActionAsync(userId, accrualId, accrualActionId).Result;
                if (removed)
                {
                    return(_dashboardRepository.GetAccrualForUserByAccrualIdAsync(userId, accrualId));
                }

                context.Errors.Add(new ExecutionError("Error removing accrual action."));
                return(null);
            });

            Field <AccrualGraphType>("modifyAccrual", "",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <IdGraphType> >
            {
                Name = "accrualId", Description = "The accrual to add."
            },
                                         new QueryArgument <NonNullGraphType <AccrualInputType> >
            {
                Name = "accrual", Description = "The accrual to update."
            }
                                         ),
                                     resolve: context =>
            {
                string accrualIdArgument = context.GetArgument <string>("accrualId");
                var accrualInput         = context.GetArgument <AccrualInput>("accrual");
                string userId            = _httpContextAccessor.HttpContext.User.UserId();

                Guid.TryParse(accrualIdArgument, out var accrualId);

                bool result = AccrualValidator.TryValidate(accrualInput, out var errors);
                if (result)
                {
                    var accrual = _dashboardRepository.GetAccrualForUserByAccrualIdAsync(userId, accrualId).Result;

                    accrual.Name             = accrualInput.Name;
                    accrual.StartingHours    = accrualInput.StartingHours;
                    accrual.AccrualRate      = accrualInput.AccrualRate;
                    accrual.StartingDate     = accrualInput.StartingDate;
                    accrual.Ending           = accrualInput.Ending;
                    accrual.AccrualFrequency = accrualInput.AccrualFrequency;
                    accrual.LastModified     = _dotNetProvider.DateTimeNow;
                    accrual.HourlyRate       = accrualInput.HourlyRate;
                    accrual.MinHours         = accrualInput.MinHours;
                    accrual.MaxHours         = accrualInput.MaxHours;
                    accrual.IsHeart          = accrualInput.IsHeart;
                    accrual.IsArchived       = accrualInput.IsArchived;
                    accrual.DayOfPayA        = accrualInput.AccrualFrequency == AccrualFrequency.SemiMonthly
                            ? accrualInput.DayOfPayA
                            : null;
                    accrual.DayOfPayB = accrualInput.AccrualFrequency == AccrualFrequency.SemiMonthly
                            ? accrualInput.DayOfPayB
                            : null;

                    bool modified = _dashboardRepository.ModifyAccrualAsync(accrual).Result;
                    if (modified)
                    {
                        return(_dashboardRepository.GetAccrualForUserByAccrualIdAsync(userId, accrualId));
                    }

                    context.Errors.Add(new ExecutionError("Failed to update accrual."));
                    return(null);
                }

                context.Errors.Add(new ExecutionError(string.Join(Environment.NewLine, errors)));
                return(null);
            });

            Field <AccrualGraphType>("addAccrual", "",
                                     arguments: new QueryArguments(
                                         new QueryArgument <NonNullGraphType <AccrualInputType> >
            {
                Name = "accrual", Description = "The accrual to add."
            }
                                         ),
                                     resolve: context =>
            {
                AccrualInput input = context.GetArgument <AccrualInput>("accrual");

                bool result = AccrualValidator.TryValidate(input, out var errors);
                if (result)
                {
                    string userId  = _httpContextAccessor.HttpContext.User.UserId();
                    Guid accrualId = _dotNetProvider.NewGuid;
                    DateTime now   = _dotNetProvider.DateTimeNow;

                    var a = new Accrual
                    {
                        UserId           = userId,
                        AccrualId        = accrualId,
                        Name             = input.Name,
                        StartingHours    = input.StartingHours,
                        AccrualRate      = input.AccrualRate,
                        StartingDate     = input.StartingDate,
                        Ending           = input.Ending,
                        AccrualFrequency = input.AccrualFrequency,
                        LastModified     = _dotNetProvider.DateTimeNow,
                        HourlyRate       = input.HourlyRate,
                        IsHeart          = input.IsHeart,
                        IsArchived       = input.IsArchived,
                        MinHours         = input.MinHours,
                        MaxHours         = input.MaxHours,
                        DayOfPayA        = input.AccrualFrequency == AccrualFrequency.SemiMonthly ? input.DayOfPayA : null,
                        DayOfPayB        = input.AccrualFrequency == AccrualFrequency.SemiMonthly ? input.DayOfPayB : null,
                        Actions          = new List <AccrualActionRecord>
                        {
                            new AccrualActionRecord(_dotNetProvider.NewGuid.ToString(), AccrualAction.Created, null,
                                                    null, null, now)
                        }
                    };

                    bool added = _dashboardRepository.AddAccrual(a).Result;
                    if (added)
                    {
                        return(_dashboardRepository.GetAccrualForUserByAccrualIdAsync(userId, accrualId));
                    }

                    context.Errors.Add(new ExecutionError("Error adding new accrual."));
                    return(null);
                }

                context.Errors.Add(new ExecutionError(string.Join(Environment.NewLine, errors)));
                return(null);
            });
        }