diff --git a/demo requests/foodsharing.srv.medeba-media.de_Archive [26-01-29 20-52-17].har b/demo requests/foodsharing.srv.medeba-media.de_Archive [26-01-29 20-52-17].har new file mode 100644 index 0000000..cb84488 --- /dev/null +++ b/demo requests/foodsharing.srv.medeba-media.de_Archive [26-01-29 20-52-17].har @@ -0,0 +1,1131 @@ +{ + "log": { + "version": "1.2", + "creator": { + "name": "Firefox", + "version": "147.0.1" + }, + "browser": { + "name": "Firefox", + "version": "147.0.1" + }, + "pages": [ + { + "id": "page_1", + "pageTimings": { + "onContentLoad": 52, + "onLoad": 406 + }, + "startedDateTime": "2026-01-29T20:51:51.660+01:00", + "title": "https://foodsharing.srv.medeba-media.de/" + } + ], + "entries": [ + { + "startedDateTime": "2026-01-29T20:51:51.660+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/auth/session", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 480 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "4642" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"1222-l7PRUMnJqXzd4XRu8ljDS3S4I/E\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 4642, + "text": "{\"profile\":{\"id\":\"839246\",\"name\":\"Meik Drechsler\",\"email\":\"meikdre@gmx.de\"},\"stores\":[{\"id\":\"44972\",\"name\":\"Aldi Süd RA Biblisweg\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"44975\",\"name\":\"Aldi Süd RA Kuppenheim\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"59378\",\"name\":\"Backwaren Kaufland\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"49712\",\"name\":\"Baden-Baden foodsharing\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"42264\",\"name\":\"Bildungshaus St. Bernhard, Rastatt\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"43191\",\"name\":\"Café Böckeler Baden-Baden\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"33875\",\"name\":\"CAP-Markt Sandweier\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"28513\",\"name\":\"denn's Biomarkt\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"42322\",\"name\":\"Edeka Fischer Haueneberstein\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"40082\",\"name\":\"Ernteaktionen rund um Baden-Baden\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"40261\",\"name\":\"Eventbetrieb Rastatt/Baden-Baden\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"63871\",\"name\":\"Fairteiler Rastatt St. Alexander\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"51450\",\"name\":\"Hornbach KA-Grünwinkel\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"62551\",\"name\":\"Koordinationsbetrieb Fairteiler Sandweier \",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"53552\",\"name\":\"Koordinationsbetrieb Fairteiler Spitalkirche\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"43754\",\"name\":\"Koordinationsbetrieb Lebensmittelspenden für Geflüchtete bei Sinzheim\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"66125\",\"name\":\"Murgtal Foodsharing\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"62533\",\"name\":\"New Pop-Festival\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"31602\",\"name\":\"Notfallteam Rastatt/Baden-Baden / spontane Abholungen\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"63448\",\"name\":\"Penny Baden-Oos\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"42141\",\"name\":\"Restaurant Poké You\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"36100\",\"name\":\"Bäckerei Späth\",\"pickupStatus\":null,\"membershipStatus\":2,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false}],\"isAdmin\":true,\"adminSettings\":{\"scheduleCron\":\"*/10 7-22 * * *\",\"pickupFallbackCron\":\"0 7,12,17,22 * * *\",\"pickupWindowOffsetsMinutes\":[-1,-0.5,0,0.5,1,1.5],\"regularPickupRefreshCron\":\"0 3 * * *\",\"dormantMembershipCron\":\"0 * * * *\",\"randomDelayMinSeconds\":5,\"randomDelayMaxSeconds\":40,\"initialDelayMinSeconds\":3,\"initialDelayMaxSeconds\":20,\"storeWatchCron\":\"0 7-22/4 * * *\",\"storeWatchInitialDelayMinSeconds\":10,\"storeWatchInitialDelayMaxSeconds\":60,\"storeWatchRequestDelayMs\":200,\"storeWatchStatusCacheMaxAgeMinutes\":120,\"storePickupCheckDelayMs\":200,\"ignoredSlots\":[{\"storeId\":\"51450\",\"slotName\":\"TVS\",\"info\":\"Hornbach Veranwortlicher\"}],\"notifications\":{\"ntfy\":{\"enabled\":true,\"serverUrl\":\"https://ntfy.srv.medeba-media.de/\",\"topicPrefix\":\"FoodSharingPickups\",\"username\":\"\",\"password\":\"\"},\"telegram\":{\"enabled\":true,\"botToken\":\"1416641529:AAHTJypvLgndzmKow743zDJv0RYL5ifO4zw\",\"chatId\":\"676175721\"}}},\"storeRefreshJob\":null,\"storesFresh\":true}" + }, + "redirectURL": "", + "headersSize": 289, + "bodySize": 4931 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 15, + "receive": 0 + }, + "time": 15, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.719+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/config", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 474 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "3834" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"efa-0HeSZXL8tUe+nD5YhtadW/7F/54\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 3834, + "text": "[{\"id\":\"44972\",\"label\":\"Aldi Süd RA Biblisweg\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2026-01-02T23:00:00.000Z\",\"desiredWeekday\":null,\"desiredDateRange\":{\"start\":\"2026-02-26\",\"end\":\"2026-02-26\"}},{\"id\":\"44975\",\"label\":\"Aldi Süd RA Kuppenheim\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2026-01-08T23:00:00.000Z\",\"desiredDateRange\":{\"start\":\"2026-02-18\",\"end\":\"2026-02-18\"}},{\"id\":\"59378\",\"label\":\"Backwaren Kaufland\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"skipDormantCheck\":true},{\"id\":\"49712\",\"label\":\"Baden-Baden foodsharing\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"42264\",\"label\":\"Bildungshaus St. Bernhard, Rastatt\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-11-30T23:00:00.000Z\"},{\"id\":\"43191\",\"label\":\"Café Böckeler Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-12-17T23:00:00.000Z\"},{\"id\":\"33875\",\"label\":\"CAP-Markt Sandweier\",\"active\":true,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"desiredWeekday\":\"Donnerstag\",\"lastPickupAt\":\"2025-12-21T23:00:00.000Z\"},{\"id\":\"28513\",\"label\":\"denn's Biomarkt\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-08-21T22:00:00.000Z\"},{\"id\":\"42322\",\"label\":\"Edeka Fischer Haueneberstein\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-11-23T23:00:00.000Z\"},{\"id\":\"40082\",\"label\":\"Ernteaktionen rund um Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"40261\",\"label\":\"Eventbetrieb Rastatt/Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"51450\",\"label\":\"Hornbach KA-Grünwinkel\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"62551\",\"label\":\"Koordinationsbetrieb Fairteiler Sandweier \",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"53552\",\"label\":\"Koordinationsbetrieb Fairteiler Spitalkirche\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"43754\",\"label\":\"Koordinationsbetrieb Lebensmittelspenden für Geflüchtete bei Sinzheim\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"66125\",\"label\":\"Murgtal Foodsharing\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"62533\",\"label\":\"New Pop-Festival\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"31602\",\"label\":\"Notfallteam Rastatt/Baden-Baden / spontane Abholungen\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"63448\",\"label\":\"Penny Baden-Oos\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-10-03T22:00:00.000Z\"},{\"id\":\"41393\",\"label\":\"Weihnachtsmarkt Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"22787\",\"label\":\"Weihnachtsmarkt Rastatt\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true},{\"id\":\"36100\",\"label\":\"Bäckerei Späth\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"42141\",\"label\":\"Restaurant Poké You\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"63871\",\"label\":\"Fairteiler Rastatt St. Alexander\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true}]" + }, + "redirectURL": "", + "headersSize": 288, + "bodySize": 4122 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 95, + "receive": 0 + }, + "time": 95, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.720+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/user/preferences", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 484 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "125" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"7d-ei4dU+tk83MW99HVk96l21BoXTA\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 125, + "text": "{\"location\":{\"lat\":48.80617805,\"lon\":8.222051246654733,\"updatedAt\":1769716312266,\"label\":\"Baden-Baden\",\"city\":\"Baden-Baden\"}}" + }, + "redirectURL": "", + "headersSize": 286, + "bodySize": 411 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 0, + "receive": 0 + }, + "time": 0, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.721+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/admin/settings", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 482 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "872" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"368-VjTOEwqAjDoi9LsL/5AWbTLIQKM\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 872, + "text": "{\"scheduleCron\":\"*/10 7-22 * * *\",\"pickupFallbackCron\":\"0 7,12,17,22 * * *\",\"pickupWindowOffsetsMinutes\":[-1,-0.5,0,0.5,1,1.5],\"regularPickupRefreshCron\":\"0 3 * * *\",\"dormantMembershipCron\":\"0 * * * *\",\"randomDelayMinSeconds\":5,\"randomDelayMaxSeconds\":40,\"initialDelayMinSeconds\":3,\"initialDelayMaxSeconds\":20,\"storeWatchCron\":\"0 7-22/4 * * *\",\"storeWatchInitialDelayMinSeconds\":10,\"storeWatchInitialDelayMaxSeconds\":60,\"storeWatchRequestDelayMs\":200,\"storeWatchStatusCacheMaxAgeMinutes\":120,\"storePickupCheckDelayMs\":200,\"ignoredSlots\":[{\"storeId\":\"51450\",\"slotName\":\"TVS\",\"info\":\"Hornbach Veranwortlicher\"}],\"notifications\":{\"ntfy\":{\"enabled\":true,\"serverUrl\":\"https://ntfy.srv.medeba-media.de/\",\"topicPrefix\":\"FoodSharingPickups\",\"username\":\"\",\"password\":\"\"},\"telegram\":{\"enabled\":true,\"botToken\":\"1416641529:AAHTJypvLgndzmKow743zDJv0RYL5ifO4zw\",\"chatId\":\"676175721\"}}}" + }, + "redirectURL": "", + "headersSize": 287, + "bodySize": 1159 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 48, + "receive": 0 + }, + "time": 48, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.721+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/notifications/settings", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 490 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "269" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"10d-H8UnTk15v8W5RBnpeojP91u/4ps\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 269, + "text": "{\"settings\":{\"ntfy\":{\"enabled\":true,\"topic\":\"Meik\",\"serverUrl\":\"\"},\"telegram\":{\"enabled\":true,\"chatId\":\"676175721\"}},\"capabilities\":{\"ntfy\":{\"enabled\":true,\"serverUrl\":\"https://ntfy.srv.medeba-media.de/\",\"topicPrefix\":\"FoodSharingPickups\"},\"telegram\":{\"enabled\":true}}}" + }, + "redirectURL": "", + "headersSize": 287, + "bodySize": 556 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 143, + "receive": 0 + }, + "time": 143, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.722+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/auth/session", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 480 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "4642" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"1222-l7PRUMnJqXzd4XRu8ljDS3S4I/E\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 4642, + "text": "{\"profile\":{\"id\":\"839246\",\"name\":\"Meik Drechsler\",\"email\":\"meikdre@gmx.de\"},\"stores\":[{\"id\":\"44972\",\"name\":\"Aldi Süd RA Biblisweg\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"44975\",\"name\":\"Aldi Süd RA Kuppenheim\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"59378\",\"name\":\"Backwaren Kaufland\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"49712\",\"name\":\"Baden-Baden foodsharing\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"42264\",\"name\":\"Bildungshaus St. Bernhard, Rastatt\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"43191\",\"name\":\"Café Böckeler Baden-Baden\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"33875\",\"name\":\"CAP-Markt Sandweier\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"28513\",\"name\":\"denn's Biomarkt\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"42322\",\"name\":\"Edeka Fischer Haueneberstein\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"40082\",\"name\":\"Ernteaktionen rund um Baden-Baden\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"40261\",\"name\":\"Eventbetrieb Rastatt/Baden-Baden\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"63871\",\"name\":\"Fairteiler Rastatt St. Alexander\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"51450\",\"name\":\"Hornbach KA-Grünwinkel\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"62551\",\"name\":\"Koordinationsbetrieb Fairteiler Sandweier \",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"53552\",\"name\":\"Koordinationsbetrieb Fairteiler Spitalkirche\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"43754\",\"name\":\"Koordinationsbetrieb Lebensmittelspenden für Geflüchtete bei Sinzheim\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"66125\",\"name\":\"Murgtal Foodsharing\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"62533\",\"name\":\"New Pop-Festival\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"31602\",\"name\":\"Notfallteam Rastatt/Baden-Baden / spontane Abholungen\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false},{\"id\":\"63448\",\"name\":\"Penny Baden-Oos\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"42141\",\"name\":\"Restaurant Poké You\",\"pickupStatus\":0,\"membershipStatus\":1,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":true},{\"id\":\"36100\",\"name\":\"Bäckerei Späth\",\"pickupStatus\":null,\"membershipStatus\":2,\"isManaging\":false,\"city\":\"\",\"street\":\"\",\"zip\":\"\",\"hasPickupSlots\":false}],\"isAdmin\":true,\"adminSettings\":{\"scheduleCron\":\"*/10 7-22 * * *\",\"pickupFallbackCron\":\"0 7,12,17,22 * * *\",\"pickupWindowOffsetsMinutes\":[-1,-0.5,0,0.5,1,1.5],\"regularPickupRefreshCron\":\"0 3 * * *\",\"dormantMembershipCron\":\"0 * * * *\",\"randomDelayMinSeconds\":5,\"randomDelayMaxSeconds\":40,\"initialDelayMinSeconds\":3,\"initialDelayMaxSeconds\":20,\"storeWatchCron\":\"0 7-22/4 * * *\",\"storeWatchInitialDelayMinSeconds\":10,\"storeWatchInitialDelayMaxSeconds\":60,\"storeWatchRequestDelayMs\":200,\"storeWatchStatusCacheMaxAgeMinutes\":120,\"storePickupCheckDelayMs\":200,\"ignoredSlots\":[{\"storeId\":\"51450\",\"slotName\":\"TVS\",\"info\":\"Hornbach Veranwortlicher\"}],\"notifications\":{\"ntfy\":{\"enabled\":true,\"serverUrl\":\"https://ntfy.srv.medeba-media.de/\",\"topicPrefix\":\"FoodSharingPickups\",\"username\":\"\",\"password\":\"\"},\"telegram\":{\"enabled\":true,\"botToken\":\"1416641529:AAHTJypvLgndzmKow743zDJv0RYL5ifO4zw\",\"chatId\":\"676175721\"}}},\"storeRefreshJob\":null,\"storesFresh\":true}" + }, + "redirectURL": "", + "headersSize": 289, + "bodySize": 4931 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 190, + "receive": 0 + }, + "time": 190, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.736+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/location/nearest-store?lat=48.80617805&lon=8.222051246654733", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [ + { + "name": "lat", + "value": "48.80617805" + }, + { + "name": "lon", + "value": "8.222051246654733" + } + ], + "headersSize": 528 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "201" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"c9-sb8UWl5x+jSWpucvJKe2+1MxvHo\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 201, + "text": "{\"store\":{\"storeId\":\"42322\",\"label\":\"Baden-Baden • Rastatt/Baden-Baden\",\"name\":\"Edeka Fischer Haueneberstein\",\"city\":\"Baden-Baden\",\"regionName\":\"Rastatt/Baden-Baden\",\"distanceKm\":0.8511950204668871}}" + }, + "redirectURL": "", + "headersSize": 286, + "bodySize": 487 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 223, + "receive": 0 + }, + "time": 223, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + }, + { + "startedDateTime": "2026-01-29T20:51:51.964+01:00", + "request": { + "bodySize": 0, + "method": "GET", + "url": "https://foodsharing.srv.medeba-media.de/api/config", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "Host", + "value": "foodsharing.srv.medeba-media.de" + }, + { + "name": "User-Agent", + "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0" + }, + { + "name": "Accept", + "value": "*/*" + }, + { + "name": "Accept-Language", + "value": "de,en-US;q=0.9,en;q=0.8" + }, + { + "name": "Accept-Encoding", + "value": "gzip, deflate, br, zstd" + }, + { + "name": "Authorization", + "value": "Bearer e82f8b70-155c-442e-96d5-060a9e5ea369" + }, + { + "name": "Connection", + "value": "keep-alive" + }, + { + "name": "Sec-Fetch-Dest", + "value": "empty" + }, + { + "name": "Sec-Fetch-Mode", + "value": "cors" + }, + { + "name": "Sec-Fetch-Site", + "value": "same-origin" + }, + { + "name": "Priority", + "value": "u=4" + }, + { + "name": "Pragma", + "value": "no-cache" + }, + { + "name": "Cache-Control", + "value": "no-cache" + }, + { + "name": "TE", + "value": "trailers" + } + ], + "cookies": [], + "queryString": [], + "headersSize": 474 + }, + "response": { + "status": 200, + "statusText": "", + "httpVersion": "HTTP/2", + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Thu, 29 Jan 2026 19:51:52 GMT" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "3834" + }, + { + "name": "x-powered-by", + "value": "Express" + }, + { + "name": "access-control-allow-origin", + "value": "*" + }, + { + "name": "etag", + "value": "W/\"efa-0HeSZXL8tUe+nD5YhtadW/7F/54\"" + }, + { + "name": "referrer-policy", + "value": "no-referrer" + }, + { + "name": "X-Firefox-Spdy", + "value": "h2" + } + ], + "cookies": [], + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 3834, + "text": "[{\"id\":\"44972\",\"label\":\"Aldi Süd RA Biblisweg\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2026-01-02T23:00:00.000Z\",\"desiredWeekday\":null,\"desiredDateRange\":{\"start\":\"2026-02-26\",\"end\":\"2026-02-26\"}},{\"id\":\"44975\",\"label\":\"Aldi Süd RA Kuppenheim\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2026-01-08T23:00:00.000Z\",\"desiredDateRange\":{\"start\":\"2026-02-18\",\"end\":\"2026-02-18\"}},{\"id\":\"59378\",\"label\":\"Backwaren Kaufland\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"skipDormantCheck\":true},{\"id\":\"49712\",\"label\":\"Baden-Baden foodsharing\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"42264\",\"label\":\"Bildungshaus St. Bernhard, Rastatt\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-11-30T23:00:00.000Z\"},{\"id\":\"43191\",\"label\":\"Café Böckeler Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-12-17T23:00:00.000Z\"},{\"id\":\"33875\",\"label\":\"CAP-Markt Sandweier\",\"active\":true,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"desiredWeekday\":\"Donnerstag\",\"lastPickupAt\":\"2025-12-21T23:00:00.000Z\"},{\"id\":\"28513\",\"label\":\"denn's Biomarkt\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-08-21T22:00:00.000Z\"},{\"id\":\"42322\",\"label\":\"Edeka Fischer Haueneberstein\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-11-23T23:00:00.000Z\"},{\"id\":\"40082\",\"label\":\"Ernteaktionen rund um Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"40261\",\"label\":\"Eventbetrieb Rastatt/Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"51450\",\"label\":\"Hornbach KA-Grünwinkel\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"62551\",\"label\":\"Koordinationsbetrieb Fairteiler Sandweier \",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"53552\",\"label\":\"Koordinationsbetrieb Fairteiler Spitalkirche\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"43754\",\"label\":\"Koordinationsbetrieb Lebensmittelspenden für Geflüchtete bei Sinzheim\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"66125\",\"label\":\"Murgtal Foodsharing\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"62533\",\"label\":\"New Pop-Festival\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"31602\",\"label\":\"Notfallteam Rastatt/Baden-Baden / spontane Abholungen\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"63448\",\"label\":\"Penny Baden-Oos\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":false,\"lastPickupAt\":\"2025-10-03T22:00:00.000Z\"},{\"id\":\"41393\",\"label\":\"Weihnachtsmarkt Baden-Baden\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"22787\",\"label\":\"Weihnachtsmarkt Rastatt\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true},{\"id\":\"36100\",\"label\":\"Bäckerei Späth\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"42141\",\"label\":\"Restaurant Poké You\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true,\"skipDormantCheck\":true},{\"id\":\"63871\",\"label\":\"Fairteiler Rastatt St. Alexander\",\"active\":false,\"checkProfileId\":true,\"onlyNotify\":false,\"hidden\":true}]" + }, + "redirectURL": "", + "headersSize": 288, + "bodySize": 4122 + }, + "cache": {}, + "timings": { + "blocked": 0, + "dns": 0, + "connect": 0, + "ssl": 0, + "send": 0, + "wait": 47, + "receive": 0 + }, + "time": 47, + "_securityState": "secure", + "serverIPAddress": "192.168.178.33", + "connection": "443", + "pageref": "page_1" + } + ] + } +} \ No newline at end of file diff --git a/server.js b/server.js index 59ceb2d..b7d8677 100644 --- a/server.js +++ b/server.js @@ -150,6 +150,31 @@ async function fetchProfileWithCache(session, { force = false } = {}) { } } +async function buildRegularPickupMapForConfig(session, config) { + try { + const entries = Array.isArray(config) ? config : []; + const storeIds = Array.from( + new Set(entries.filter((entry) => entry?.id && !entry.hidden).map((entry) => String(entry.id))) + ); + if (storeIds.length === 0) { + return {}; + } + const results = await Promise.all( + storeIds.map(async (storeId) => { + const result = await getRegularPickupSchedule(session, storeId); + return [storeId, Array.isArray(result.rules) ? result.rules : []]; + }) + ); + return results.reduce((acc, [storeId, rules]) => { + acc[storeId] = rules; + return acc; + }, {}); + } catch (error) { + console.warn('[PICKUP] Regular-Pickup-Map konnte nicht geladen werden:', error.message); + return {}; + } +} + function scheduleWithCurrentSettings(sessionId, config) { const settings = adminConfig.readSettings(); scheduleConfig(sessionId, config, settings); @@ -848,9 +873,13 @@ app.post('/api/auth/logout', requireAuth, (req, res) => { app.get('/api/auth/session', requireAuth, async (req, res) => { const settings = adminConfig.readSettings(); const { stores } = await loadStoresForSession(req.session, settings, { reason: 'session-check' }); + const config = readConfig(req.session.profile.id); + const regularPickupMap = await buildRegularPickupMapForConfig(req.session, config); res.json({ profile: req.session.profile, stores, + config, + regularPickupMap, isAdmin: !!req.session.isAdmin, adminSettings: req.session.isAdmin ? settings : undefined, storeRefreshJob: summarizeJob(getStoreRefreshJob(req.session.id)), @@ -1336,34 +1365,8 @@ app.get('/api/stores/:storeId/regular-pickup', requireAuth, async (req, res) => app.get('/api/stores', requireAuth, async (req, res) => { const stores = req.session.storesCache?.data || []; - let regularPickupMap = {}; - try { - const profileId = req.session.profile?.id; - if (profileId) { - const config = readConfig(profileId); - const storeIds = Array.from( - new Set( - (Array.isArray(config) ? config : []) - .filter((entry) => entry?.id && !entry.hidden) - .map((entry) => String(entry.id)) - ) - ); - if (storeIds.length > 0) { - const results = await Promise.all( - storeIds.map(async (storeId) => { - const result = await getRegularPickupSchedule(req.session, storeId); - return [storeId, Array.isArray(result.rules) ? result.rules : []]; - }) - ); - regularPickupMap = results.reduce((acc, [storeId, rules]) => { - acc[storeId] = rules; - return acc; - }, {}); - } - } - } catch (error) { - console.warn('[PICKUP] Regular-Pickup-Map konnte nicht geladen werden:', error.message); - } + const config = readConfig(req.session.profile.id); + const regularPickupMap = await buildRegularPickupMapForConfig(req.session, config); res.json({ stores, regularPickupMap }); }); diff --git a/src/App.js b/src/App.js index 2f264f7..dee6394 100644 --- a/src/App.js +++ b/src/App.js @@ -40,6 +40,7 @@ function App() { const [focusedStoreId, setFocusedStoreId] = useState(null); const [nearestStoreLabel, setNearestStoreLabel] = useState(null); const [regularPickupMap, setRegularPickupMap] = useState({}); + const bootstrapOnceRef = useRef(false); const minSelectableDate = useMemo(() => startOfDay(new Date()), []); const weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag']; @@ -232,9 +233,12 @@ function App() { setStores(Array.isArray(result.stores) ? result.stores : []); setAdminSettingsSnapshot(result.adminSettings ?? null); setConfig(Array.isArray(result.config) ? result.config : []); + if (result.regularPickupMap && typeof result.regularPickupMap === 'object') { + setRegularPickupMap(result.regularPickupMap); + } return result; }, - [setStores, setAdminSettingsSnapshot, setConfig] + [setStores, setAdminSettingsSnapshot, setConfig, setRegularPickupMap] ); const resetSessionState = useCallback(() => { @@ -361,6 +365,10 @@ function App() { let ticker; let cancelled = false; (async () => { + if (bootstrapOnceRef.current) { + return; + } + bootstrapOnceRef.current = true; const storedToken = getStoredToken(); if (!storedToken) { return; diff --git a/src/hooks/useSessionManager.js b/src/hooks/useSessionManager.js index e602907..2b86f5d 100644 --- a/src/hooks/useSessionManager.js +++ b/src/hooks/useSessionManager.js @@ -91,26 +91,32 @@ const useSessionManager = ({ normalizeConfigEntries, onUnauthorized, setError, s progress?.update?.('Betriebe werden geprüft...', 45); const stores = Array.isArray(data.stores) ? data.stores : []; const adminSettings = data.isAdmin ? normalizeAdminSettings(data.adminSettings) : null; - - const configResponse = await fetch('/api/config', { - headers: { Authorization: `Bearer ${token}` } - }); - if (configResponse.status === 401) { - handleUnauthorized(); - return {}; + const configSource = Array.isArray(data.config) ? data.config : data.config || null; + let config = normalizeConfigEntries(Array.isArray(configSource) ? configSource : []); + if (!configSource) { + const configResponse = await fetch('/api/config', { + headers: { Authorization: `Bearer ${token}` } + }); + if (configResponse.status === 401) { + handleUnauthorized(); + return {}; + } + if (!configResponse.ok) { + throw new Error(`HTTP ${configResponse.status}`); + } + const configData = await configResponse.json(); + progress?.update?.('Konfiguration wird geladen...', 75); + config = normalizeConfigEntries(Array.isArray(configData) ? configData : []); + } else { + progress?.update?.('Konfiguration wird geladen...', 75); } - if (!configResponse.ok) { - throw new Error(`HTTP ${configResponse.status}`); - } - const configData = await configResponse.json(); - progress?.update?.('Konfiguration wird geladen...', 75); - const config = normalizeConfigEntries(Array.isArray(configData) ? configData : []); progress?.update?.('Synchronisierung abgeschlossen', 95); return { session: sessionData, stores, adminSettings, + regularPickupMap: data.regularPickupMap ?? null, config, storeRefreshJob: data.storeRefreshJob, storesFresh: data.storesFresh