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; }
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; } } }
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; } } }
/// <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); } }