{"id":18836761,"url":"https://github.com/grimmle/office-occupancy","last_synced_at":"2026-04-08T18:31:15.574Z","repository":{"id":42288730,"uuid":"245209548","full_name":"grimmle/office-occupancy","owner":"grimmle","description":"tool for checking and changing occupancy of workspaces in a large office.","archived":false,"fork":false,"pushed_at":"2022-12-30T19:50:53.000Z","size":1672,"stargazers_count":0,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-03T18:46:23.921Z","etag":null,"topics":["express","mern","mern-stack","mongodb","node","react","rest-api"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/grimmle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-05T16:11:34.000Z","updated_at":"2023-05-05T18:45:44.000Z","dependencies_parsed_at":"2023-01-31T15:01:11.538Z","dependency_job_id":null,"html_url":"https://github.com/grimmle/office-occupancy","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/grimmle/office-occupancy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimmle%2Foffice-occupancy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimmle%2Foffice-occupancy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimmle%2Foffice-occupancy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimmle%2Foffice-occupancy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grimmle","download_url":"https://codeload.github.com/grimmle/office-occupancy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grimmle%2Foffice-occupancy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31568577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["express","mern","mern-stack","mongodb","node","react","rest-api"],"created_at":"2024-11-08T02:31:53.846Z","updated_at":"2026-04-08T18:31:15.541Z","avatar_url":"https://github.com/grimmle.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Office Occupancy Tool\nAuthor: Lennard Grimm\n\n\n## 1. Technologien\n\nMERN Stack - **M**ongoDB **E**xpress **R**eactJS **N**odeJS\n\n## 2. Datenmodelle\n**Workplace:**\nstellt einen einzelnen Arbeitsplatz dar. Dieser beinhaltet alle notwendigen Informationen und seine zugehörigen Belegungen. Die eindeutige _id für einen Arbeitsplatz muss bei einem POST mitgegeben werden. Sie setzt sich aus der Raumnummer und einem Buchstaben pro Arbeitsplatz zusammen (z.B. 4407A, 4407B, 3508B).\n\n\tconst mongoose = require(\"mongoose\");\n\tconst Employee = require(\"./employee.model\");\n\tconst Schema = mongoose.Schema;\n\n\tconst Workplace = new Schema(\n\t  {\n\t    _id: {\n\t      type: String,\n\t      required: true\n\t    },\n\t    location: {\n\t      type: String,\n\t      required: true\n\t    },\n\t    hasPC: {\n\t      type: Boolean,\n\t      required: true\n\t    },\n\t    reservations: [\n\t      { startDate: {\n\t\ttype: Date,\n\t\tdefault: undefined\n\t      },\n\t      endDate: {\n\t\ttype: Date,\n\t\tdefault: undefined\n\t      },\n\t      employee: {\n\t\ttype: mongoose.Schema.Types.ObjectId,\n\t\tref: \"Employee\",\n\t\tdefault: undefined\n\t      },\n\t      note: {\n\t\ttype: String,\n\t\tdefault: \"\"\n\t      }\n\t    }\n\t  ],\n\t}\n\t);\n\n\tmodule.exports = mongoose.model(\"Workplace\", Workplace);\n\n\n**Employee:**\nstellt einen Mitarbeiter dar. Ein Mitarbeiter bekommt bei der Erstellung automatisch von MongoDB eine eindeutige _id zugeordnet.\n\n\tconst mongoose = require(\"mongoose\");\n\tconst Schema = mongoose.Schema;\n\n\tconst Employee = new Schema(\n\t  {\n\t    firstName: {\n\t      type: String,\n\t      required: true\n\t    },\n\t    lastName: {\n\t      type: String,\n\t      required: true\n\t    },\n\t  }\n\t);\n\n\tmodule.exports = mongoose.model(\"Employee\", Employee);\n\n## 3. Routen\n\nEs gibt für die beiden Datenmodelle je eine Route um REST Aufrufe daran auszuführen:\n\n\n### URL/workplaces\n**GET** gibt alle Arbeitsplätze zurück (optional mit Filter und Sortierung). Werden keine Arbeitsplätze mit den angegebenen Filtern gefunden, wird ein leeres Array zurückgegeben. Filter und Sortierungen können in der URL mit einem ? und dem gewünschten Parameter angehangen werden z.B.\n\n\t/workplaces?sort=location:1\n(sortiert die Arbeitsplätze aufsteigend nach dem Standort).\nStandardmäßig werden die Arbeitsplätze aufsteigend nach ihrer _id sortiert. Mehrere Parameter werden mit einem \u0026 konkateniert z.B.\n\n\t/workplaces?hasPC=true\u0026location=Hohenzollerndamm\nSo können beliebig viele Filter und Sortierung angewandt werden.\nAußerdem wurde ein ‘search’-Parameter eingebaut der mittels eines regulären Ausdrucks alle Arbeitsplätze herausfiltert in deren _id der Suchbegriff vorkommt z.B.\n\n\t/workplaces?search=4\nliefert alle Arbeitsplätze deren _id eine 4 enthält.\nWeiterhin können auch Arbeitsplätze und deren Belegungen in einem bestimmten Zeitraum angezeigt werden. Durch Angabe eines Datums im Format YYYY/MM/DD kann ein startDate und endDate als Query-Parameter übergeben werden. Nun werden alle Arbeitsplätze bzw. deren Belegungen nach Überlappungen mit dem angegebenen Zeitraum durchsucht. Ausgegeben werden Arbeitsplätze mit keinen Belegungen in diesem Zeitraum und Arbeitsplätze die in diesem Zeitraum bereits belegt sind. z.B.\n\n\t/workplaces?startDate=2019/07/01\u0026endDate=2019/07/08\nfiltert nach dem Zeitraum 01.07.2019 - 08.07.2019.\nDurch Übergabe des Query-Parameters isReserved=false werden nur noch Arbeitsplätze ausgegeben, die im angegebenen Zeitraum frei sind.\n\n**POST** fügt einen neuen Arbeitsplatz hinzu.\nBenötigt werden die Parameter _id (String), location (String) und hasPC (Boolean). Ein neuer Arbeitsplatz hat ein leeres Array an Belegungen.\n\n---\n### URL/workplaces/:id\n**GET** gibt, wenn vorhanden, den Arbeitsplatz mit der _id zurück.\n\n\t/workplaces/4407A\n**PATCH** ermöglicht es die Parameter location und hasPC des Arbeitsplatzes mit zugehöriger _id zu ändern. Im Body der PATCH-Request kann einer oder beide Parameter mit neuen Werten übergeben werden.\n\n**DELETE** löscht den Arbeitsplatz mit übergebener _id.\n\n---\n### URL/workplaces/:id/reservations\n**GET** gibt alle Belegungen eines Arbeitsplatzes aus.\n\n**POST** fügt einem Arbeitsplatz mit der _id eine neue Belegung hinzu. Benötigt werden im Request Body die Parameter: startDate (String, YYYY/MM/DD), endDate (String, YYYY/MM/DD) und employee (String, mittels einer ObjectId). Optional kann einer Belegung mit dem Parameter note (String) eine Notiz hinzugefügt werden.\n\n---\n### URL/workplaces/:id/reservations/:rid\n**GET** gibt die Belegung mit :rid des Arbeitsplatzes mit :id zurück. Die :rid ist eine von MongoDB erzeugte ObjectId. z.B.\n\n\t/workplaces/4407A/reservations/507f191e810c19729de860ea\n**PATCH**  ermöglicht es, eine Belegung zu bearbeiten (Nicht ausreichend getestet). Durch Übergabe einzelner Parameter im Request Body können diese verändert werden.\n\n**DELETE** löscht die Belegung mit :rid.\n\n---\n### URL/employees (bisher nur zum Testen eingerichtet)\n**GET** gibt alle Mitarbeiter zurück.\n\n**POST** fügt einen neuen Mitarbeiter hinzu. Benötigt werden firstName(String) und lastName(String).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrimmle%2Foffice-occupancy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrimmle%2Foffice-occupancy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrimmle%2Foffice-occupancy/lists"}