Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.00 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using ESGI.BL.Core;
  5. using ESGI.BL.Core.Validation;
  6. using ESGI.DAL.Core;
  7. using ESGI.DAL.Core.Extensions;
  8. using ESGI.SchoolYears.DAL;
  9. using ESGI.SchoolYears.DAL.Repositories;
  10. using ESGI.ServiceCore.Commands;
  11. using TsyCreator = ESGI.SchoolYears.Workflows.TeacherSchoolYears.Create.IWorkflow;
  12.  
  13. namespace ESGI.SchoolYears.Commands.UserJoinedToSchool
  14. {
  15.     public class InModel
  16.     {
  17.         public int SchoolID;
  18.         public int UserID;
  19.         public int GlobalSchoolYearID;
  20.         public char UserType;
  21.         public int? TrackID { get; set; }
  22.         public int? MaxStudents { get; set; }
  23.     }
  24.  
  25.     public class OutModel
  26.     {
  27.         public List<TeacherSchoolYear> TeacherSchoolYears { get; set; }
  28.     }
  29.  
  30.     public interface ICommand : ICommand<InModel, OutModel>
  31.     {
  32.  
  33.     }
  34.  
  35.     public class Command : AsyncCommand<InModel, OutModel>, ICommand
  36.     {
  37.         private readonly ISchoolYearRepository _schoolYearsRepository;
  38.         private readonly ITeacherSchoolYearRepository _teacherSchoolYearRepository;
  39.         private readonly ITracksToSchoolRepository _trackToSchoolRepository;
  40.         private readonly TsyCreator _tsyCreator;
  41.         private Idle<List<SchoolYear>> _schoolYears;
  42.         private Idle<List<TrackToSchoolModel>> _trackToSchool;
  43.  
  44.         public Command(IUnitOfWork unitOfWork, ISchoolYearRepository schoolYears,
  45.             ITeacherSchoolYearRepository teacherSchoolYearRepository, ITracksToSchoolRepository trackToSchoolRepository, TsyCreator tsyCreator) : base(unitOfWork)
  46.         {
  47.             _schoolYearsRepository = schoolYears;
  48.             _teacherSchoolYearRepository = teacherSchoolYearRepository;
  49.             _trackToSchoolRepository = trackToSchoolRepository;
  50.             _tsyCreator = tsyCreator;
  51.         }
  52.  
  53.         protected override async Task<OutModel> Execute(InModel model, ICommandContext context)
  54.         {
  55.             var schoolYears = await _schoolYears;
  56.             var modelBuilder = _tsyCreator.ModelBuilder.WithUser(model.UserID).WithUserType(model.UserType);
  57.  
  58.             string currentYearTrackName = null;
  59.             var result = schoolYears
  60.                 .GroupJoin(await _trackToSchool, schoolYear => schoolYear.GlobalSchoolYearID,
  61.                     schoolModel => schoolModel.GlobalSchoolYearId, (schoolYear, trackToSchoolModels) =>
  62.                     {
  63.                         TrackToSchoolModel ts;
  64.                         if (schoolYear.GlobalSchoolYearID == model.GlobalSchoolYearID)
  65.                         {
  66.                             ts = trackToSchoolModels.FirstOrDefault(ttsm => model.TrackID == null || ttsm.TrackId == model.TrackID.Value);
  67.                             currentYearTrackName = ts?.TrackName;
  68.                         }
  69.                         else
  70.                         {
  71.                             ts = trackToSchoolModels.FirstOrDefault(m => currentYearTrackName == null || m.TrackName == currentYearTrackName);
  72.                             if (ts == null)
  73.                             {
  74.                                 ts = trackToSchoolModels.FirstOrDefault();
  75.                             }
  76.                         }
  77.  
  78.                         var wfmodel = modelBuilder.WithSchoolYear(schoolYear).WithTrackToSchool(ts?.TracksToSchool).WithMaxStudents(model.MaxStudents).Build();
  79.                         var resultModel = _tsyCreator.Flow(wfmodel, context).Result;
  80.                         return resultModel.TeacherSchoolYear;
  81.                     }).ToList();
  82.  
  83.             return new OutModel
  84.             {
  85.                 TeacherSchoolYears = result
  86.             };
  87.         }
  88.  
  89.         protected override Task Validate(InModel model, ICommandContext context)
  90.         {
  91.             // for prevent shown error in exceptionless.
  92.             if (model.UserType != 'T')
  93.                 throw new UserFriendlyValidationException("User must be a teacher to create a Teacher school year");
  94.  
  95.             return Task.CompletedTask;
  96.         }
  97.  
  98.         protected override Task Init(InModel model, ICommandContext context)
  99.         {
  100.             var usedSys = Idle.From(() =>
  101.             {
  102.                 return _teacherSchoolYearRepository.ByUserID(model.UserID)
  103.                     .NotDeleted
  104.                     .Select(t => t.TeacherSchoolYear.SchoolYearID)
  105.                     .ToListAsync();
  106.             });
  107.  
  108.             _schoolYears = Idle.From(async () =>
  109.             {
  110.                 var tsys = await usedSys;
  111.                 return await _schoolYearsRepository.BySchoolID(model.SchoolID).Where(s => !tsys.Contains(s.SchoolYear.SchoolYearID) && s.SchoolYear.GlobalSchoolYearID >= model.GlobalSchoolYearID)
  112.                     .Select(s => s.SchoolYear)
  113.                     .OrderBy(s => s.GlobalSchoolYearID)
  114.                     .ToListAsync(context.CancellationToken);
  115.             });
  116.  
  117.             _trackToSchool = Idle.From(() =>
  118.             {
  119.                 if (model.SchoolID == 0)
  120.                 {
  121.                     return Task.FromResult(new List<TrackToSchoolModel>());
  122.                 }
  123.  
  124.                 return _trackToSchoolRepository
  125.                     .BySchoolID(model.SchoolID)
  126.                     .Where(s => s.Track.GlobalSchoolYear.GlobalSchoolYearID >= model.GlobalSchoolYearID)
  127.                     .Select(s => new TrackToSchoolModel
  128.                     {
  129.                         GlobalSchoolYearId = s.Track.GlobalSchoolYearID,
  130.                         TracksToSchool = s.TracksToSchool,
  131.                         TrackId = s.Track.TrackID,
  132.                         TrackName = s.Track.Name,
  133.                     })
  134.                     .ToListAsync();
  135.             });
  136.  
  137.             return Task.CompletedTask;
  138.         }
  139.  
  140.  
  141.         private class TrackToSchoolModel
  142.         {
  143.             public int TrackId { get; set; }
  144.             public string TrackName { get; set; }
  145.             public int? GlobalSchoolYearId { get; set; }
  146.             public TracksToSchool TracksToSchool { get; set; }
  147.         }
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement