diff --git a/diagrams/ER-db.drawio b/diagrams/ER-db.drawio new file mode 100644 index 0000000..0630590 --- /dev/null +++ b/diagrams/ER-db.drawio @@ -0,0 +1,191 @@ +<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" version="26.0.1"> + <diagram id="R2lEEEUBdFMjLlhIrx00" name="Page-1"> + <mxGraphModel dx="1434" dy="780" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0" extFonts="Permanent Marker^https://fonts.googleapis.com/css?family=Permanent+Marker"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-1" value="qrs" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1"> + <mxGeometry x="590" y="40" width="210" height="160" as="geometry"> + <mxRectangle x="320" y="40" width="60" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-2" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-1"> + <mxGeometry y="30" width="210" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-3" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-2"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-4" value="key_code TEXT NOT NULL" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-2"> + <mxGeometry x="30" width="180" height="30" as="geometry"> + <mxRectangle width="180" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-5" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-1"> + <mxGeometry y="60" width="210" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-6" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-5"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-7" value="door_id TEXT NOT NULL" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-5"> + <mxGeometry x="30" width="180" height="30" as="geometry"> + <mxRectangle width="180" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-8" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-1"> + <mxGeometry y="90" width="210" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-9" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-8"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-10" value="start_date_time TIMESTAMP WITH TIME ZONE" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-8"> + <mxGeometry x="30" width="180" height="30" as="geometry"> + <mxRectangle width="180" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-11" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-1"> + <mxGeometry y="120" width="210" height="40" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-12" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-11"> + <mxGeometry width="30" height="40" as="geometry"> + <mxRectangle width="30" height="40" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-13" value="end_date_time TIMESTAMP WITH TIME ZONE" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-11"> + <mxGeometry x="30" width="180" height="40" as="geometry"> + <mxRectangle width="180" height="40" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-14" value="clients" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1"> + <mxGeometry x="60" y="200" width="180" height="140" as="geometry"> + <mxRectangle x="40" y="200" width="70" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-15" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-14"> + <mxGeometry y="30" width="180" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-16" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-15"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-17" value="<span style="font-weight: 400;">client_id NOT NULL TEXT</span>" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-15"> + <mxGeometry x="30" width="150" height="30" as="geometry"> + <mxRectangle width="150" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-18" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-14"> + <mxGeometry y="60" width="180" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-19" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-18"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-20" value="client_secret NOT NULL TEXT" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-18"> + <mxGeometry x="30" width="150" height="30" as="geometry"> + <mxRectangle width="150" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-21" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-14"> + <mxGeometry y="90" width="180" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-22" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-21"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-23" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-21"> + <mxGeometry x="30" width="150" height="30" as="geometry"> + <mxRectangle width="150" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-24" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-14"> + <mxGeometry y="120" width="180" height="20" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-25" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-24"> + <mxGeometry width="30" height="20" as="geometry"> + <mxRectangle width="30" height="20" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-26" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-24"> + <mxGeometry x="30" width="150" height="20" as="geometry"> + <mxRectangle width="150" height="20" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-27" value="doors" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1"> + <mxGeometry x="320" y="130" width="180" height="140" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-28" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-27"> + <mxGeometry y="30" width="180" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-29" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-28"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-30" value="id TEXT NOT NULL" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-28"> + <mxGeometry x="30" width="150" height="30" as="geometry"> + <mxRectangle width="150" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-31" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-27"> + <mxGeometry y="60" width="180" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-32" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-31"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-33" value="unit_id TEXT NOT NULL" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-31"> + <mxGeometry x="30" width="150" height="30" as="geometry"> + <mxRectangle width="150" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-34" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-27"> + <mxGeometry y="90" width="180" height="30" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-35" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-34"> + <mxGeometry width="30" height="30" as="geometry"> + <mxRectangle width="30" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-36" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-34"> + <mxGeometry x="30" width="150" height="30" as="geometry"> + <mxRectangle width="150" height="30" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-37" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-27"> + <mxGeometry y="120" width="180" height="20" as="geometry" /> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-38" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-37"> + <mxGeometry width="30" height="20" as="geometry"> + <mxRectangle width="30" height="20" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-39" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="CW1ftrLNUtnkjzRNXEjj-37"> + <mxGeometry x="30" width="150" height="20" as="geometry"> + <mxRectangle width="150" height="20" as="alternateBounds" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-45" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="CW1ftrLNUtnkjzRNXEjj-15" target="CW1ftrLNUtnkjzRNXEjj-31"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="230" y="400" as="sourcePoint" /> + <mxPoint x="330" y="300" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="CW1ftrLNUtnkjzRNXEjj-46" value="" style="edgeStyle=entityRelationEdgeStyle;fontSize=12;html=1;endArrow=ERzeroToMany;startArrow=ERmandOne;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="CW1ftrLNUtnkjzRNXEjj-28" target="CW1ftrLNUtnkjzRNXEjj-5"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="470" y="350" as="sourcePoint" /> + <mxPoint x="570" y="250" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile>