Example #1
0
        public async Task <RegisterProgramResponse> Register(RegisterProgramRequest request)
        {
            try
            {
                if (!ApiRequestsValidator.IsRequestValid(request, out List <string> errors))
                {
                    return(new RegisterProgramResponse(new BadRequestException(string.Join(", ", errors))));
                }

                if (await this.Work.Programs.GetByTelemetryKey(request.TelemetryKey).ConfigureAwait(false) != null)
                {
                    return(new RegisterProgramResponse(new BadRequestException($"Use different telemetry key")));
                }

                TelimenaUser user = await this.Work.Users.FirstOrDefaultAsync(x => x.UserName == this.User.Identity.Name).ConfigureAwait(false);

                if (user == null)
                {
                    return(new RegisterProgramResponse(new BadRequestException($"Cannot find user [{this.User.Identity.Name}]")));
                }
                DeveloperTeam developerTeam = user.GetDeveloperAccountsLedByUser().FirstOrDefault();
                if (developerTeam == null)
                {
                    return(new RegisterProgramResponse(new BadRequestException($"Cannot find developer account associated with user [{user.UserName}]")));
                }

                Program program = new Program(request.Name, request.TelemetryKey)
                {
                    Description = request.Description
                };

                ProgramAssembly primaryAss = new ProgramAssembly()
                {
                    Name      = Path.GetFileNameWithoutExtension(request.PrimaryAssemblyFileName),
                    Extension = Path.GetExtension(request.PrimaryAssemblyFileName)
                };

                await this.Work.RegisterProgram(developerTeam, program, primaryAss).ConfigureAwait(false);

                program = await this.Work.Programs.GetByTelemetryKey(request.TelemetryKey).ConfigureAwait(false);

                var url = this.Url?.Link("Default", new { Controller = "ProgramManagement", Action = "Index", telemetryKey = program.TelemetryKey });
                return(new RegisterProgramResponse(program.TelemetryKey, program.DeveloperTeam.PublicId, url));
            }
            catch (Exception ex)
            {
                return(new RegisterProgramResponse(ex));
            }
        }
        public ICodeAssembly Compile(ICodeProgram program)
        {
            var compilation = RoslynCompile(program);
            var assembly = new ProgramAssembly
                           {
                               EntryPointClassName = "EntryPoint",
                               EntryPointMethodName = "Main"
                           };

            using (var stream = new MemoryStream())
            {
                var emitResult = compilation.Emit(stream);

                if (!emitResult.Success)
                {
                    return null;
                }

                assembly.CompiledAssembly = stream.ToArray();
            }

            return assembly;
        }
Example #3
0
        private async Task RegisterProgramInternalFallback(DeveloperTeam developerTeam, Program program, ProgramAssembly primaryAss)
        {
            using (DbContextTransaction dbContextTransaction = this.portalContext.Database.BeginTransaction())
            {
                List <DbEntityEntry> changedEntities = this.portalContext.ChangeTracker.Entries().ToList();
                changedEntities.AddRange(this.telemetryContext.ChangeTracker.Entries().ToList());
                foreach (DbEntityEntry dbEntityEntry in changedEntities)
                {
                    if (dbEntityEntry.State == EntityState.Added)
                    {
                        dbEntityEntry.State = EntityState.Detached;
                    }
                    else
                    {
                        await dbEntityEntry.ReloadAsync().ConfigureAwait(false);
                    }
                }

                int topPrgId = this.telemetryContext.TelemetryRootObjects.OrderByDescending(x => x.ProgramId)
                               .FirstOrDefault()?.ProgramId ?? 0;
                topPrgId++;
                program.Id = topPrgId;



                try
                {
                    developerTeam.AddProgram(program);

                    string tblName = nameof(Program) + "s";

                    program.PrimaryAssembly = primaryAss;

                    this.portalContext.Database.ExecuteSqlCommand($"DBCC CHECKIDENT('[dbo].[{tblName}]', RESEED, {topPrgId})");
                    this.portalContext.Programs.Add(program);
                    await this.portalContext.SaveChangesAsync().ConfigureAwait(false);

                    Program savedPrg = await this.portalContext.Programs.FirstOrDefaultAsync(x => x.PublicId == program.PublicId).ConfigureAwait(false);

                    TelemetryRootObject teleRoot = new TelemetryRootObject()
                    {
                        ProgramId    = savedPrg.Id,
                        TelemetryKey = savedPrg.TelemetryKey
                    };


                    this.telemetryContext.TelemetryRootObjects.Add(teleRoot);

                    await this.telemetryContext.SaveChangesAsync().ConfigureAwait(false);

                    dbContextTransaction.Commit();
                }
                catch (Exception)
                {
                    dbContextTransaction.Rollback();
                    throw;
                }
            }
        }
Example #4
0
        private async Task RegisterProgramInternal(DeveloperTeam developerTeam, Program program, ProgramAssembly primaryAss)
        {
            using (var dbContextTransaction = this.portalContext.Database.BeginTransaction())
            {
                try
                {
                    developerTeam.AddProgram(program);

                    program.PrimaryAssembly = primaryAss;
                    this.portalContext.Programs.Add(program);

                    await this.portalContext.SaveChangesAsync().ConfigureAwait(false);

                    var savedPrg = await this.portalContext.Programs.FirstOrDefaultAsync(x => x.PublicId == program.PublicId).ConfigureAwait(false);

                    var teleRoot = new TelemetryRootObject()
                    {
                        ProgramId    = savedPrg.Id,
                        TelemetryKey = savedPrg.TelemetryKey
                    };


                    this.telemetryContext.TelemetryRootObjects.Add(teleRoot);

                    await this.telemetryContext.SaveChangesAsync().ConfigureAwait(false);

                    dbContextTransaction.Commit();
                }
                catch (Exception)
                {
                    dbContextTransaction.Rollback();
                    throw;
                }
            }
        }
Example #5
0
 /// <summary>
 /// Handles adding program to both databases and commits transaction
 /// </summary>
 /// <param name="developerTeam">The developer team.</param>
 /// <param name="program">The program.</param>
 /// <param name="primaryAss">The primary ass.</param>
 /// <returns>Task.</returns>
 public async Task RegisterProgram(DeveloperTeam developerTeam, Program program, ProgramAssembly primaryAss)
 {
     try
     {
         await this.RegisterProgramInternal(developerTeam, program, primaryAss).ConfigureAwait(false);
     }
     catch (Exception)
     {
         await this.RegisterProgramInternalFallback(developerTeam, program, primaryAss)
         .ConfigureAwait(false);
     }
 }