Anruf-Popup mit Job-Knöpfen und Annehmen; Anrufkarte entfernt
Adressen tragen die Kennungen ihrer Jobs (job_ids) – das Anruf-Popup zeigt
je Kennung einen Knopf, der den Job über den neuen Endpunkt
GET /api/jobs/{id} aus der Sammlung holt und seine Sprungadresse (url) in
einem neuen Tab öffnet; Fehler (unbekannte Kennung, Ablage nicht
erreichbar) erscheinen im Popup. Der Knopf "Auftrag öffnen" (customer.url)
ist entfallen.
Das Popup öffnet jetzt bei jedem eingehenden Anruf – mit Kundendaten, wenn
die Rufnummer einem Kunden gehört, sonst nur mit der Rufnummer – und trägt
links unten einen grünen Knopf "Anruf annehmen", solange es klingelt. Die
Anrufkarte über den Tabs (IncomingCallCard) ist damit überflüssig und
samt Styles ausgebaut; ein Ablehnen-Knopf fehlt dem Popup noch.
Die Debug-Starts beenden vorab einen Altlauf des Backends: eine Task macht
Port 8080 frei (nur der Lauscher – lsof ohne -sTCP:LISTEN träfe auch den
Vite-Proxy) und hängt als preLaunchTask an beiden Backend-Konfigurationen;
tasks.json wandert dafür mit ins Repo.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -105,6 +105,16 @@ public class ArchiveService {
|
||||
submit("Jobdaten", () -> mongo.save(job));
|
||||
}
|
||||
|
||||
/**
|
||||
* Der Job zur Kennung des Fremdsystems – gelesen direkt aus der Sammlung
|
||||
* {@code jobs}, wie {@link #addresses} ohne Zwischenstand im Backend.
|
||||
*
|
||||
* @return der Job, oder {@code null} wenn die Kennung nicht abgelegt ist
|
||||
*/
|
||||
public JobEntry job(long id) {
|
||||
return mongo.findById(id, JobEntry.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Löscht alle Jobs, deren {@code ordertime} vor der Grenze liegt (Vergleich
|
||||
* als Text, siehe {@link JobCleanupService}). Läuft anders als die
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
package de.appcreation.swyxweb.web;
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
|
||||
import de.appcreation.swyxweb.storage.ArchiveService;
|
||||
import de.appcreation.swyxweb.storage.JobEntry;
|
||||
|
||||
/**
|
||||
* Jobs aus der MongoDB herausgeben. Herein kommen sie über den Webhook (siehe
|
||||
* WebhookController); hier holt sich der Browser einen einzelnen Job zu einer
|
||||
* Kennung aus {@code job_ids} eines Kunden – etwa um beim Anruf-Popup die
|
||||
* Sprungadresse ({@code url}) des Jobs zu öffnen.
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/api/jobs")
|
||||
public class JobController {
|
||||
|
||||
private final ArchiveService archive;
|
||||
|
||||
public JobController(ArchiveService archive) {
|
||||
this.archive = archive;
|
||||
}
|
||||
|
||||
/** Der Job zur Kennung des Fremdsystems; 404, wenn er nicht abgelegt ist. */
|
||||
@GetMapping("/{id}")
|
||||
public JobEntry get(@PathVariable long id) {
|
||||
JobEntry job = archive.job(id);
|
||||
if (job == null) {
|
||||
throw new ResponseStatusException(HttpStatus.NOT_FOUND,
|
||||
"Kein Job mit der Kennung " + id + " in der Ablage.");
|
||||
}
|
||||
return job;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package de.appcreation.swyxweb;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.bean.override.mockito.MockitoBean;
|
||||
import org.springframework.test.web.servlet.MockMvc;
|
||||
|
||||
import de.appcreation.swyxweb.storage.ArchiveService;
|
||||
import de.appcreation.swyxweb.storage.JobEntry;
|
||||
|
||||
/**
|
||||
* Der Endpunkt liefert einen einzelnen Job zur Kennung des Fremdsystems – so
|
||||
* kommt das Anruf-Popup von einer Kennung aus {@code job_ids} an die
|
||||
* Sprungadresse des Jobs. Der {@link ArchiveService} ist ersetzt – der Test
|
||||
* läuft ohne MongoDB.
|
||||
*/
|
||||
@SpringBootTest
|
||||
@AutoConfigureMockMvc
|
||||
class JobControllerTests {
|
||||
|
||||
@Autowired
|
||||
MockMvc mvc;
|
||||
|
||||
@MockitoBean
|
||||
ArchiveService archive;
|
||||
|
||||
@Test
|
||||
void returnsStoredJob() throws Exception {
|
||||
when(archive.job(21891263L)).thenReturn(new JobEntry(21891263L, null,
|
||||
"https://test.sb.assecutor.de/admin/jb_detail.php?job_id=21891263",
|
||||
1, "2026-08-13T13:35:27", null, null, null, null, null, null, null, null, null, null));
|
||||
|
||||
mvc.perform(get("/api/jobs/21891263"))
|
||||
.andExpect(status().isOk())
|
||||
.andExpect(jsonPath("$.id").value(21891263))
|
||||
.andExpect(jsonPath("$.url").value("https://test.sb.assecutor.de/admin/jb_detail.php?job_id=21891263"));
|
||||
}
|
||||
|
||||
@Test
|
||||
void unknownIdIsNotFound() throws Exception {
|
||||
when(archive.job(4711L)).thenReturn(null);
|
||||
|
||||
mvc.perform(get("/api/jobs/4711"))
|
||||
.andExpect(status().isNotFound());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user