using System.Net; using System.Text.RegularExpressions; using Tranga.Jobs; using Tranga.MangaConnectors; namespace Tranga.Server; public partial class Server { private ValueTuple GetV2Jobs(GroupCollection groups, Dictionary requestParameters) { return new ValueTuple(HttpStatusCode.OK, _parent.jobBoss.jobs.Select(job => job.id)); } private ValueTuple GetV2JobsRunning(GroupCollection groups, Dictionary requestParameters) { return new ValueTuple(HttpStatusCode.OK, _parent.jobBoss.jobs .Where(job => job.progressToken.state is ProgressToken.State.Running) .Select(job => job.id)); } private ValueTuple GetV2JobsWaiting(GroupCollection groups, Dictionary requestParameters) { return new ValueTuple(HttpStatusCode.OK, _parent.jobBoss.jobs .Where(job => job.progressToken.state is ProgressToken.State.Waiting) .Select(job => job.id)); } private ValueTuple GetV2JobsMonitoring(GroupCollection groups, Dictionary requestParameters) { return new ValueTuple(HttpStatusCode.OK, _parent.jobBoss.jobs .Where(job => job.jobType is Job.JobType.DownloadNewChaptersJob) .Select(job => job.id)); } private ValueTuple GetV2JobTypes(GroupCollection groups, Dictionary requestParameters) { return new ValueTuple(HttpStatusCode.OK, Enum.GetValues().ToDictionary(b => (byte)b, b => Enum.GetName(b))); } private ValueTuple PostV2JobCreateType(GroupCollection groups, Dictionary requestParameters) { if (groups.Count < 1 || !Enum.TryParse(groups[1].Value, true, out Job.JobType jobType)) { return new ValueTuple(HttpStatusCode.NotFound, $"JobType {groups[1].Value} does not exist."); } string? mangaId; Manga? manga; switch (jobType) { case Job.JobType.MonitorManga: if(!requestParameters.TryGetValue("internalId", out mangaId) || !_parent.TryGetPublicationById(mangaId, out manga) || manga is null) return new ValueTuple(HttpStatusCode.NotFound, "'internalId' Parameter missing, or is not a valid ID."); if(!requestParameters.TryGetValue("interval", out string? intervalStr) || !TimeSpan.TryParse(intervalStr, out TimeSpan interval)) return new ValueTuple(HttpStatusCode.InternalServerError, "'interval' Parameter missing, or is not in correct format."); requestParameters.TryGetValue("language", out string? language); if (requestParameters.TryGetValue("customFolder", out string? folder)) manga.Value.MovePublicationFolder(TrangaSettings.downloadLocation, folder); if (requestParameters.TryGetValue("startChapter", out string? startChapterStr) && float.TryParse(startChapterStr, out float startChapter)) { Manga manga1 = manga.Value; manga1.ignoreChaptersBelow = startChapter; } return _parent.jobBoss.AddJob(new DownloadNewChapters(this, ((Manga)manga).mangaConnector, ((Manga)manga).internalId, true, interval, language)) switch { true => new ValueTuple(HttpStatusCode.OK, null), false => new ValueTuple(HttpStatusCode.Conflict, "Job already exists."), }; case Job.JobType.UpdateMetaDataJob: if(!requestParameters.TryGetValue("internalId", out mangaId) || !_parent.TryGetPublicationById(mangaId, out manga) || manga is null) return new ValueTuple(HttpStatusCode.NotFound, "InternalId Parameter missing, or is not a valid ID."); return _parent.jobBoss.AddJob(new UpdateMetadata(this, ((Manga)manga).internalId)) switch { true => new ValueTuple(HttpStatusCode.OK, null), false => new ValueTuple(HttpStatusCode.Conflict, "Job already exists."), }; case Job.JobType.DownloadNewChaptersJob: //TODO case Job.JobType.DownloadChapterJob: //TODO default: return new ValueTuple(HttpStatusCode.MethodNotAllowed, $"JobType {Enum.GetName(jobType)} is not supported."); } } private ValueTuple GetV2JobJobId(GroupCollection groups, Dictionary requestParameters) { if (groups.Count < 1 || !_parent.jobBoss.TryGetJobById(groups[1].Value, out Job? job) || job is null) { return new ValueTuple(HttpStatusCode.NotFound, $"Job with ID: '{groups[1].Value}' does not exist."); } return new ValueTuple(HttpStatusCode.OK, job); } private ValueTuple DeleteV2JobJobId(GroupCollection groups, Dictionary requestParameters) { if (groups.Count < 1 || !_parent.jobBoss.TryGetJobById(groups[1].Value, out Job? job) || job is null) { return new ValueTuple(HttpStatusCode.NotFound, $"Job with ID: '{groups[1].Value}' does not exist."); } _parent.jobBoss.RemoveJob(job); return new ValueTuple(HttpStatusCode.OK, null); } private ValueTuple GetV2JobJobIdProgress(GroupCollection groups, Dictionary requestParameters) { if (groups.Count < 1 || !_parent.jobBoss.TryGetJobById(groups[1].Value, out Job? job) || job is null) { return new ValueTuple(HttpStatusCode.BadRequest, $"Job with ID: '{groups[1].Value}' does not exist."); } return new ValueTuple(HttpStatusCode.OK, job.progressToken); } private ValueTuple PostV2JobJobIdStartNow(GroupCollection groups, Dictionary requestParameters) { if (groups.Count < 1 || !_parent.jobBoss.TryGetJobById(groups[1].Value, out Job? job) || job is null) { return new ValueTuple(HttpStatusCode.NotFound, $"Job with ID: '{groups[1].Value}' does not exist."); } _parent.jobBoss.AddJobs(job.ExecuteReturnSubTasks(_parent.jobBoss)); return new ValueTuple(HttpStatusCode.OK, null); } private ValueTuple PostV2JobJobIdCancel(GroupCollection groups, Dictionary requestParameters) { if (groups.Count < 1 || !_parent.jobBoss.TryGetJobById(groups[1].Value, out Job? job) || job is null) { return new ValueTuple(HttpStatusCode.NotFound, $"Job with ID: '{groups[1].Value}' does not exist."); } job.Cancel(); return new ValueTuple(HttpStatusCode.OK, null); } private ValueTuple GetV2Job(GroupCollection groups, Dictionary requestParameters) { if(!requestParameters.TryGetValue("jobIds", out string? jobIdListStr)) return new ValueTuple(HttpStatusCode.BadRequest, "Missing parameter 'jobIds'."); string[] jobIdList = jobIdListStr.Split(','); List ret = new(); foreach (string jobId in jobIdList) { if(!_parent.jobBoss.TryGetJobById(jobId, out Job? job) || job is null) return new ValueTuple(HttpStatusCode.NotFound, $"Job with id '{jobId}' not found."); ret.Add(job); } return new ValueTuple(HttpStatusCode.OK, ret); } }