namespace marlin.web.Controllers.Api; using core.contracts; using core.models; using core.models.plan; using Data; using Grpc.Core; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Models; using ProtoBuf.Grpc; using Util; [Authorize(Policy = "JobScoped")] public class InstanceGrpcService(ApplicationDbContext dbContext) : IInstanceService { public async Task SendLogEvent(LogEventRequest request, CallContext context = default) { var user = context.ServerCallContext!.GetHttpContext().User; var jobId = user.RequireJobId(); dbContext.Logs.Add(new LogEventRecord { At = request.At, Message = request.Message, Error = request.Error, StepId = request.StepId, JobId = jobId }); await dbContext.SaveChangesAsync(context.CancellationToken); } public async Task SendStatusUpdate(StatusUpdateRequest request, CallContext context = default) { var user = context.ServerCallContext!.GetHttpContext().User; var jobId = user.RequireJobId(); var job = await dbContext.Jobs .FirstAsync(x => x.Id == jobId, context.CancellationToken); job.Status = request.Status; dbContext.JobStatusUpdates.Add(new JobStatusUpdate { At = DateTime.UtcNow, Status = request.Status, Job = job }); await dbContext.SaveChangesAsync(context.CancellationToken); } }