added /materials route
This commit is contained in:
		
							
								
								
									
										1
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								.idea/inspectionProfiles/Project_Default.xml
									
									
									
										generated
									
									
									
								
							@@ -2,5 +2,6 @@
 | 
				
			|||||||
  <profile version="1.0">
 | 
					  <profile version="1.0">
 | 
				
			||||||
    <option name="myName" value="Project Default" />
 | 
					    <option name="myName" value="Project Default" />
 | 
				
			||||||
    <inspection_tool class="JSUnfilteredForInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
 | 
					    <inspection_tool class="JSUnfilteredForInLoop" enabled="false" level="WARNING" enabled_by_default="false" />
 | 
				
			||||||
 | 
					    <inspection_tool class="ReservedWordUsedAsNameJS" enabled="false" level="WARNING" enabled_by_default="false" />
 | 
				
			||||||
  </profile>
 | 
					  </profile>
 | 
				
			||||||
</component>
 | 
					</component>
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/condition/{id}:
 | 
					/condition/{id}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Id'
 | 
					    - $ref: 'api.yaml#/components/parameters/Id'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO condition by id
 | 
					    summary: TODO condition by id
 | 
				
			||||||
    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
					    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
				
			||||||
@@ -12,15 +12,15 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Condition'
 | 
					              $ref: 'api.yaml#/components/schemas/Condition'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: TODO add/change condition
 | 
					    summary: TODO add/change condition
 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
@@ -33,24 +33,24 @@
 | 
				
			|||||||
      content:
 | 
					      content:
 | 
				
			||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/Condition'
 | 
					            $ref: 'api.yaml#/components/schemas/Condition'
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        description: condition details
 | 
					        description: condition details
 | 
				
			||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Condition'
 | 
					              $ref: 'api.yaml#/components/schemas/Condition'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: TODO delete condition
 | 
					    summary: TODO delete condition
 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
@@ -60,14 +60,14 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
							
								
								
									
										121
									
								
								api/material.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								api/material.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					/materials:
 | 
				
			||||||
 | 
					  get:
 | 
				
			||||||
 | 
					    summary: lists all materials
 | 
				
			||||||
 | 
					    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - /material
 | 
				
			||||||
 | 
					    responses:
 | 
				
			||||||
 | 
					      200:
 | 
				
			||||||
 | 
					        description: all material details
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              type: array
 | 
				
			||||||
 | 
					              items:
 | 
				
			||||||
 | 
					                $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
 | 
					      401:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
 | 
					      500:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/material/{id}:
 | 
				
			||||||
 | 
					  parameters:
 | 
				
			||||||
 | 
					    - $ref: 'api.yaml#/components/parameters/Id'
 | 
				
			||||||
 | 
					  get:
 | 
				
			||||||
 | 
					    summary: get material details
 | 
				
			||||||
 | 
					    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - /material
 | 
				
			||||||
 | 
					    responses:
 | 
				
			||||||
 | 
					      200:
 | 
				
			||||||
 | 
					        description: material details
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
 | 
					      401:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
 | 
					      404:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
 | 
					      500:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					  put:
 | 
				
			||||||
 | 
					    summary: TODO change material
 | 
				
			||||||
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - /material
 | 
				
			||||||
 | 
					    security:
 | 
				
			||||||
 | 
					      - BasicAuth: []
 | 
				
			||||||
 | 
					    requestBody:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					      content:
 | 
				
			||||||
 | 
					        application/json:
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
 | 
					    responses:
 | 
				
			||||||
 | 
					      200:
 | 
				
			||||||
 | 
					        description: material details
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
 | 
					      400:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
 | 
					      401:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
 | 
					      403:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
 | 
					      404:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
 | 
					      500:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					  delete:
 | 
				
			||||||
 | 
					    summary: TODO delete material
 | 
				
			||||||
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - /material
 | 
				
			||||||
 | 
					    security:
 | 
				
			||||||
 | 
					      - BasicAuth: []
 | 
				
			||||||
 | 
					    responses:
 | 
				
			||||||
 | 
					      200:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
 | 
					      400:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
 | 
					      401:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
 | 
					      403:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
 | 
					      404:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
 | 
					      500:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/material/new:
 | 
				
			||||||
 | 
					  post:
 | 
				
			||||||
 | 
					    summary: TODO add material
 | 
				
			||||||
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
 | 
					    tags:
 | 
				
			||||||
 | 
					      - /material
 | 
				
			||||||
 | 
					    security:
 | 
				
			||||||
 | 
					      - BasicAuth: []
 | 
				
			||||||
 | 
					    requestBody:
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					      content:
 | 
				
			||||||
 | 
					        application/json:
 | 
				
			||||||
 | 
					          schema:
 | 
				
			||||||
 | 
					            $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
 | 
					    responses:
 | 
				
			||||||
 | 
					      200:
 | 
				
			||||||
 | 
					        description: material details
 | 
				
			||||||
 | 
					        content:
 | 
				
			||||||
 | 
					          application/json:
 | 
				
			||||||
 | 
					            schema:
 | 
				
			||||||
 | 
					              $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
 | 
					      400:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
 | 
					      401:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
 | 
					      403:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
 | 
					      500:
 | 
				
			||||||
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/measurement/{id}:
 | 
					/measurement/{id}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Id'
 | 
					    - $ref: 'api.yaml#/components/parameters/Id'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO measurement values by id
 | 
					    summary: TODO measurement values by id
 | 
				
			||||||
    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
					    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
				
			||||||
@@ -12,15 +12,15 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Measurement'
 | 
					              $ref: 'api.yaml#/components/schemas/Measurement'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: TODO add/change measurement
 | 
					    summary: TODO add/change measurement
 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
@@ -33,24 +33,24 @@
 | 
				
			|||||||
      content:
 | 
					      content:
 | 
				
			||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/Measurement'
 | 
					            $ref: 'api.yaml#/components/schemas/Measurement'
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        description: measurement details
 | 
					        description: measurement details
 | 
				
			||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Measurement'
 | 
					              $ref: 'api.yaml#/components/schemas/Measurement'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: TODO delete measurement
 | 
					    summary: TODO delete measurement
 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
@@ -60,14 +60,14 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
/model/{name}:
 | 
					/model/{name}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Name'
 | 
					    - $ref: 'api.yaml#/components/parameters/Name'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO get model data by name
 | 
					    summary: TODO get model data by name
 | 
				
			||||||
    description: 'Auth: all, levels: dev, admin'
 | 
					    description: 'Auth: all, levels: dev, admin'
 | 
				
			||||||
@@ -15,13 +15,13 @@
 | 
				
			|||||||
              type: string
 | 
					              type: string
 | 
				
			||||||
              format: binary
 | 
					              format: binary
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: TODO add/replace model data by name
 | 
					    summary: TODO add/replace model data by name
 | 
				
			||||||
    description: 'Auth: all, levels: dev, admin'
 | 
					    description: 'Auth: all, levels: dev, admin'
 | 
				
			||||||
@@ -37,17 +37,17 @@
 | 
				
			|||||||
            format: binary
 | 
					            format: binary
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: TODO delete model data
 | 
					    summary: TODO delete model data
 | 
				
			||||||
    description: 'Auth: basic, levels: dev, admin'
 | 
					    description: 'Auth: basic, levels: dev, admin'
 | 
				
			||||||
@@ -57,14 +57,14 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
                  type: string
 | 
					                  type: string
 | 
				
			||||||
                  example: 'API server up and running!'
 | 
					                  example: 'API server up and running!'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/authorized:
 | 
					/authorized:
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
@@ -38,6 +38,6 @@
 | 
				
			|||||||
                  type: string
 | 
					                  type: string
 | 
				
			||||||
                  example: 'basic'
 | 
					                  example: 'basic'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -4,6 +4,7 @@ Id:
 | 
				
			|||||||
  required: true
 | 
					  required: true
 | 
				
			||||||
  schema:
 | 
					  schema:
 | 
				
			||||||
    type: string
 | 
					    type: string
 | 
				
			||||||
 | 
					  example: 5ea0450ed851c30a90e70894
 | 
				
			||||||
Name:
 | 
					Name:
 | 
				
			||||||
  name: name
 | 
					  name: name
 | 
				
			||||||
  in: path
 | 
					  in: path
 | 
				
			||||||
@@ -10,14 +10,14 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Samples'
 | 
					              $ref: 'api.yaml#/components/schemas/Samples'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/sample/{id}:
 | 
					/sample/{id}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Id'
 | 
					    - $ref: 'api.yaml#/components/parameters/Id'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO sample details
 | 
					    summary: TODO sample details
 | 
				
			||||||
    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
					    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
				
			||||||
@@ -29,15 +29,15 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/SampleDetail'
 | 
					              $ref: 'api.yaml#/components/schemas/SampleDetail'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: TODO add/change sample
 | 
					    summary: TODO add/change sample
 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
@@ -50,24 +50,24 @@
 | 
				
			|||||||
      content:
 | 
					      content:
 | 
				
			||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/Sample'
 | 
					            $ref: 'api.yaml#/components/schemas/Sample'
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        description: samples details
 | 
					        description: samples details
 | 
				
			||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/SampleDetail'
 | 
					              $ref: 'api.yaml#/components/schemas/SampleDetail'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: TODO delete sample
 | 
					    summary: TODO delete sample
 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
				
			||||||
@@ -77,17 +77,17 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/sample/notes/fields:
 | 
					/sample/notes/fields:
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO list all existing field names for custom notes fields
 | 
					    summary: TODO list all existing field names for custom notes fields
 | 
				
			||||||
@@ -107,6 +107,6 @@
 | 
				
			|||||||
                  type: number
 | 
					                  type: number
 | 
				
			||||||
                  example: 20
 | 
					                  example: 20
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -5,12 +5,13 @@ _Id:
 | 
				
			|||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    _id:
 | 
					    _id:
 | 
				
			||||||
      allOf:
 | 
					      allOf:
 | 
				
			||||||
        - $ref: 'oas.yaml#/components/schemas/Id'
 | 
					        - $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
      readOnly: true
 | 
					      readOnly: true
 | 
				
			||||||
Color:
 | 
					Color:
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    color:
 | 
					    color:
 | 
				
			||||||
      type: string
 | 
					      type: string
 | 
				
			||||||
 | 
					      example: black
 | 
				
			||||||
SampleProperties:
 | 
					SampleProperties:
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    sample_number:
 | 
					    sample_number:
 | 
				
			||||||
@@ -24,24 +25,24 @@ SampleProperties:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Samples:
 | 
					Samples:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/Color'
 | 
					    - $ref: 'api.yaml#/components/schemas/Color'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/SampleProperties'
 | 
					    - $ref: 'api.yaml#/components/schemas/SampleProperties'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    material_id:
 | 
					    material_id:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
    note_id:
 | 
					    note_id:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
    user_id:
 | 
					    user_id:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
Sample:
 | 
					Sample:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/Color'
 | 
					    - $ref: 'api.yaml#/components/schemas/Color'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/SampleProperties'
 | 
					    - $ref: 'api.yaml#/components/schemas/SampleProperties'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    material:
 | 
					    material:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Material'
 | 
					      $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
    notes:
 | 
					    notes:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
      properties:
 | 
					      properties:
 | 
				
			||||||
@@ -50,15 +51,15 @@ Sample:
 | 
				
			|||||||
        sample_references:
 | 
					        sample_references:
 | 
				
			||||||
          type: array
 | 
					          type: array
 | 
				
			||||||
          items:
 | 
					          items:
 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/Id'
 | 
					            $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
SampleDetail:
 | 
					SampleDetail:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/Color'
 | 
					    - $ref: 'api.yaml#/components/schemas/Color'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/SampleProperties'
 | 
					    - $ref: 'api.yaml#/components/schemas/SampleProperties'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    material:
 | 
					    material:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Material'
 | 
					      $ref: 'api.yaml#/components/schemas/Material'
 | 
				
			||||||
    notes:
 | 
					    notes:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
      properties:
 | 
					      properties:
 | 
				
			||||||
@@ -67,63 +68,70 @@ SampleDetail:
 | 
				
			|||||||
        sample_references:
 | 
					        sample_references:
 | 
				
			||||||
          type: array
 | 
					          type: array
 | 
				
			||||||
          items:
 | 
					          items:
 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/Id'
 | 
					            $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
    conditions:
 | 
					    conditions:
 | 
				
			||||||
      type: array
 | 
					      type: array
 | 
				
			||||||
      items:
 | 
					      items:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/schemas/Condition'
 | 
					        $ref: 'api.yaml#/components/schemas/Condition'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Material:
 | 
					Material:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    material_numbers:
 | 
					    name:
 | 
				
			||||||
 | 
					      type: string
 | 
				
			||||||
 | 
					      example: Stanyl TW 200 F8
 | 
				
			||||||
 | 
					    supplier:
 | 
				
			||||||
 | 
					      type: string
 | 
				
			||||||
 | 
					      example: DSM
 | 
				
			||||||
 | 
					    group:
 | 
				
			||||||
 | 
					      type: string
 | 
				
			||||||
 | 
					      example: PA46
 | 
				
			||||||
 | 
					    mineral:
 | 
				
			||||||
 | 
					      type: number
 | 
				
			||||||
 | 
					      example: 0
 | 
				
			||||||
 | 
					    glass_fiber:
 | 
				
			||||||
 | 
					      type: number
 | 
				
			||||||
 | 
					      example: 40
 | 
				
			||||||
 | 
					    carbon_fiber:
 | 
				
			||||||
 | 
					      type: number
 | 
				
			||||||
 | 
					      example: 0
 | 
				
			||||||
 | 
					    numbers:
 | 
				
			||||||
      type: array
 | 
					      type: array
 | 
				
			||||||
      items:
 | 
					      items:
 | 
				
			||||||
        type: object
 | 
					        type: object
 | 
				
			||||||
        allOf:
 | 
					        allOf:
 | 
				
			||||||
          - $ref: 'oas.yaml#/components/schemas/Color'
 | 
					          - $ref: 'api.yaml#/components/schemas/Color'
 | 
				
			||||||
        properties:
 | 
					        properties:
 | 
				
			||||||
          number:
 | 
					          number:
 | 
				
			||||||
            type: number
 | 
					            type: number
 | 
				
			||||||
    material_group:
 | 
					            example: 5514263423
 | 
				
			||||||
      type: string
 | 
					 | 
				
			||||||
    supplier:
 | 
					 | 
				
			||||||
      type: string
 | 
					 | 
				
			||||||
    material_name:
 | 
					 | 
				
			||||||
      type: string
 | 
					 | 
				
			||||||
    mineral:
 | 
					 | 
				
			||||||
      type: number
 | 
					 | 
				
			||||||
    glass_fiber:
 | 
					 | 
				
			||||||
      type: number
 | 
					 | 
				
			||||||
    carbon_fiber:
 | 
					 | 
				
			||||||
      type: number
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Condition:
 | 
					Condition:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    sample_id:
 | 
					    sample_id:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
    parameters:
 | 
					    parameters:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
    treatment_template:
 | 
					    treatment_template:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Measurement:
 | 
					Measurement:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    condition_id:
 | 
					    condition_id:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
    values:
 | 
					    values:
 | 
				
			||||||
      type: object
 | 
					      type: object
 | 
				
			||||||
    measurement_template:
 | 
					    measurement_template:
 | 
				
			||||||
      $ref: 'oas.yaml#/components/schemas/Id'
 | 
					      $ref: 'api.yaml#/components/schemas/Id'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Template:
 | 
					Template:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    name:
 | 
					    name:
 | 
				
			||||||
      type: string
 | 
					      type: string
 | 
				
			||||||
@@ -149,9 +157,9 @@ UserName:
 | 
				
			|||||||
      example: johndoe
 | 
					      example: johndoe
 | 
				
			||||||
User:
 | 
					User:
 | 
				
			||||||
  allOf:
 | 
					  allOf:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					    - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/UserName'
 | 
					    - $ref: 'api.yaml#/components/schemas/UserName'
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/schemas/Email'
 | 
					    - $ref: 'api.yaml#/components/schemas/Email'
 | 
				
			||||||
  properties:
 | 
					  properties:
 | 
				
			||||||
    pass:
 | 
					    pass:
 | 
				
			||||||
      type: string
 | 
					      type: string
 | 
				
			||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              type: array
 | 
					              type: array
 | 
				
			||||||
              items:
 | 
					              items:
 | 
				
			||||||
                $ref: 'oas.yaml#/components/schemas/Template'
 | 
					                $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
              example:
 | 
					              example:
 | 
				
			||||||
                name: heat aging
 | 
					                name: heat aging
 | 
				
			||||||
                parameters:
 | 
					                parameters:
 | 
				
			||||||
@@ -22,12 +22,12 @@
 | 
				
			|||||||
                    range:
 | 
					                    range:
 | 
				
			||||||
                      - copper
 | 
					                      - copper
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/templates/treatment/{name}:
 | 
					/templates/treatment/{name}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Name'
 | 
					    - $ref: 'api.yaml#/components/parameters/Name'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO treatment method details
 | 
					    summary: TODO treatment method details
 | 
				
			||||||
    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
					    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
				
			||||||
@@ -42,7 +42,7 @@
 | 
				
			|||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              allOf:
 | 
					              allOf:
 | 
				
			||||||
                - $ref: 'oas.yaml#/components/schemas/Template'
 | 
					                - $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
              example:
 | 
					              example:
 | 
				
			||||||
                name: heat aging
 | 
					                name: heat aging
 | 
				
			||||||
                parameters:
 | 
					                parameters:
 | 
				
			||||||
@@ -50,13 +50,13 @@
 | 
				
			|||||||
                    range:
 | 
					                    range:
 | 
				
			||||||
                      - copper
 | 
					                      - copper
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: TODO add/change treatment method
 | 
					    summary: TODO add/change treatment method
 | 
				
			||||||
    description: 'Auth: basic, levels: maintain, admin'
 | 
					    description: 'Auth: basic, levels: maintain, admin'
 | 
				
			||||||
@@ -70,7 +70,7 @@
 | 
				
			|||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            allOf:
 | 
					            allOf:
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/Template'
 | 
					              - $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
            example:
 | 
					            example:
 | 
				
			||||||
              name: heat aging
 | 
					              name: heat aging
 | 
				
			||||||
              parameters:
 | 
					              parameters:
 | 
				
			||||||
@@ -84,7 +84,7 @@
 | 
				
			|||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              allOf:
 | 
					              allOf:
 | 
				
			||||||
                - $ref: 'oas.yaml#/components/schemas/Template'
 | 
					                - $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
              example:
 | 
					              example:
 | 
				
			||||||
                name: heat aging
 | 
					                name: heat aging
 | 
				
			||||||
                parameters:
 | 
					                parameters:
 | 
				
			||||||
@@ -92,15 +92,15 @@
 | 
				
			|||||||
                    range:
 | 
					                    range:
 | 
				
			||||||
                      - copper
 | 
					                      - copper
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: TODO delete treatment method
 | 
					    summary: TODO delete treatment method
 | 
				
			||||||
    description: 'Auth: basic, levels: maintain, admin'
 | 
					    description: 'Auth: basic, levels: maintain, admin'
 | 
				
			||||||
@@ -110,17 +110,17 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/template/measurements:
 | 
					/template/measurements:
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO all available measurement methods
 | 
					    summary: TODO all available measurement methods
 | 
				
			||||||
@@ -137,7 +137,7 @@
 | 
				
			|||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              type: array
 | 
					              type: array
 | 
				
			||||||
              items:
 | 
					              items:
 | 
				
			||||||
                $ref: 'oas.yaml#/components/schemas/Template'
 | 
					                $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
              example:
 | 
					              example:
 | 
				
			||||||
                name: humidity
 | 
					                name: humidity
 | 
				
			||||||
                parameters:
 | 
					                parameters:
 | 
				
			||||||
@@ -146,12 +146,12 @@
 | 
				
			|||||||
                      min: 0
 | 
					                      min: 0
 | 
				
			||||||
                      max: 2
 | 
					                      max: 2
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/templates/measurement/{name}:
 | 
					/templates/measurement/{name}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Name'
 | 
					    - $ref: 'api.yaml#/components/parameters/Name'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: TODO measurement method details
 | 
					    summary: TODO measurement method details
 | 
				
			||||||
    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
					    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
				
			||||||
@@ -166,7 +166,7 @@
 | 
				
			|||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              allOf:
 | 
					              allOf:
 | 
				
			||||||
                - $ref: 'oas.yaml#/components/schemas/Template'
 | 
					                - $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
              example:
 | 
					              example:
 | 
				
			||||||
                name: humidity
 | 
					                name: humidity
 | 
				
			||||||
                parameters:
 | 
					                parameters:
 | 
				
			||||||
@@ -175,13 +175,13 @@
 | 
				
			|||||||
                      min: 0
 | 
					                      min: 0
 | 
				
			||||||
                      max: 2
 | 
					                      max: 2
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: TODO add/change measurement method
 | 
					    summary: TODO add/change measurement method
 | 
				
			||||||
    description: 'Auth: basic, levels: maintain, admin'
 | 
					    description: 'Auth: basic, levels: maintain, admin'
 | 
				
			||||||
@@ -195,7 +195,7 @@
 | 
				
			|||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            allOf:
 | 
					            allOf:
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/Template'
 | 
					              - $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
            example:
 | 
					            example:
 | 
				
			||||||
              name: humidity
 | 
					              name: humidity
 | 
				
			||||||
              parameters:
 | 
					              parameters:
 | 
				
			||||||
@@ -210,7 +210,7 @@
 | 
				
			|||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              allOf:
 | 
					              allOf:
 | 
				
			||||||
                - $ref: 'oas.yaml#/components/schemas/Template'
 | 
					                - $ref: 'api.yaml#/components/schemas/Template'
 | 
				
			||||||
              example:
 | 
					              example:
 | 
				
			||||||
                name: humidity
 | 
					                name: humidity
 | 
				
			||||||
                parameters:
 | 
					                parameters:
 | 
				
			||||||
@@ -219,15 +219,15 @@
 | 
				
			|||||||
                      min: 0
 | 
					                      min: 0
 | 
				
			||||||
                      max: 2
 | 
					                      max: 2
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: TODO delete measurement method
 | 
					    summary: TODO delete measurement method
 | 
				
			||||||
    description: 'Auth: basic, levels: maintain, admin'
 | 
					    description: 'Auth: basic, levels: maintain, admin'
 | 
				
			||||||
@@ -237,14 +237,14 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -14,13 +14,13 @@
 | 
				
			|||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              type: array
 | 
					              type: array
 | 
				
			||||||
              items:
 | 
					              items:
 | 
				
			||||||
                $ref: 'oas.yaml#/components/schemas/User'
 | 
					                $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/user:
 | 
					/user:
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: list own user details
 | 
					    summary: list own user details
 | 
				
			||||||
@@ -35,13 +35,13 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/User'
 | 
					              $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: change user details
 | 
					    summary: change user details
 | 
				
			||||||
    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
					    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
				
			||||||
@@ -55,9 +55,9 @@
 | 
				
			|||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            allOf:
 | 
					            allOf:
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/_Id'
 | 
					              - $ref: 'api.yaml#/components/schemas/_Id'
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/UserName'
 | 
					              - $ref: 'api.yaml#/components/schemas/UserName'
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/Email'
 | 
					              - $ref: 'api.yaml#/components/schemas/Email'
 | 
				
			||||||
            properties:
 | 
					            properties:
 | 
				
			||||||
              pass:
 | 
					              pass:
 | 
				
			||||||
                type: string
 | 
					                type: string
 | 
				
			||||||
@@ -75,15 +75,15 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/User'
 | 
					              $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: delete user
 | 
					    summary: delete user
 | 
				
			||||||
    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
					    description: 'Auth: basic, levels: read, write, maintain, admin'
 | 
				
			||||||
@@ -93,14 +93,14 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/user/{name}:
 | 
					/user/{name}:
 | 
				
			||||||
  parameters:
 | 
					  parameters:
 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Name'
 | 
					    - $ref: 'api.yaml#/components/parameters/Name'
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: list user details
 | 
					    summary: list user details
 | 
				
			||||||
    description: 'Auth: basic, levels: admin'
 | 
					    description: 'Auth: basic, levels: admin'
 | 
				
			||||||
@@ -114,15 +114,15 @@
 | 
				
			|||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/User'
 | 
					              $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  put:
 | 
					  put:
 | 
				
			||||||
    summary: change user details
 | 
					    summary: change user details
 | 
				
			||||||
    description: 'Auth: basic, levels: admin'
 | 
					    description: 'Auth: basic, levels: admin'
 | 
				
			||||||
@@ -135,24 +135,24 @@
 | 
				
			|||||||
      content:
 | 
					      content:
 | 
				
			||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/User'
 | 
					            $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        description: user details
 | 
					        description: user details
 | 
				
			||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/User'
 | 
					              $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
  delete:
 | 
					  delete:
 | 
				
			||||||
    summary: delete user
 | 
					    summary: delete user
 | 
				
			||||||
    description: 'Auth: basic, levels: admin'
 | 
					    description: 'Auth: basic, levels: admin'
 | 
				
			||||||
@@ -162,15 +162,15 @@
 | 
				
			|||||||
      - BasicAuth: []
 | 
					      - BasicAuth: []
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/user/key:
 | 
					/user/key:
 | 
				
			||||||
  get:
 | 
					  get:
 | 
				
			||||||
    summary: get API key for the user
 | 
					    summary: get API key for the user
 | 
				
			||||||
@@ -190,9 +190,9 @@
 | 
				
			|||||||
                  type: string
 | 
					                  type: string
 | 
				
			||||||
                  example: 5ea0450ed851c30a90e70899
 | 
					                  example: 5ea0450ed851c30a90e70899
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/user/new:
 | 
					/user/new:
 | 
				
			||||||
  post:
 | 
					  post:
 | 
				
			||||||
    summary: add new user
 | 
					    summary: add new user
 | 
				
			||||||
@@ -214,22 +214,22 @@
 | 
				
			|||||||
              - location
 | 
					              - location
 | 
				
			||||||
              - device_name
 | 
					              - device_name
 | 
				
			||||||
            allOf:
 | 
					            allOf:
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/User'
 | 
					              - $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        description: user details
 | 
					        description: user details
 | 
				
			||||||
        content:
 | 
					        content:
 | 
				
			||||||
          application/json:
 | 
					          application/json:
 | 
				
			||||||
            schema:
 | 
					            schema:
 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/User'
 | 
					              $ref: 'api.yaml#/components/schemas/User'
 | 
				
			||||||
      400:
 | 
					      400:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					        $ref: 'api.yaml#/components/responses/400'
 | 
				
			||||||
      401:
 | 
					      401:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					        $ref: 'api.yaml#/components/responses/401'
 | 
				
			||||||
      403:
 | 
					      403:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					        $ref: 'api.yaml#/components/responses/403'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
/user/passreset:
 | 
					/user/passreset:
 | 
				
			||||||
  post:
 | 
					  post:
 | 
				
			||||||
    summary: reset password and send mail to restore
 | 
					    summary: reset password and send mail to restore
 | 
				
			||||||
@@ -244,12 +244,12 @@
 | 
				
			|||||||
        application/json:
 | 
					        application/json:
 | 
				
			||||||
          schema:
 | 
					          schema:
 | 
				
			||||||
            allOf:
 | 
					            allOf:
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/UserName'
 | 
					              - $ref: 'api.yaml#/components/schemas/UserName'
 | 
				
			||||||
              - $ref: 'oas.yaml#/components/schemas/Email'
 | 
					              - $ref: 'api.yaml#/components/schemas/Email'
 | 
				
			||||||
    responses:
 | 
					    responses:
 | 
				
			||||||
      200:
 | 
					      200:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					        $ref: 'api.yaml#/components/responses/Ok'
 | 
				
			||||||
      404:
 | 
					      404:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/404'
 | 
					        $ref: 'api.yaml#/components/responses/404'
 | 
				
			||||||
      500:
 | 
					      500:
 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					        $ref: 'api.yaml#/components/responses/500'
 | 
				
			||||||
@@ -1,67 +0,0 @@
 | 
				
			|||||||
/material/{id}:
 | 
					 | 
				
			||||||
  parameters:
 | 
					 | 
				
			||||||
    - $ref: 'oas.yaml#/components/parameters/Id'
 | 
					 | 
				
			||||||
  get:
 | 
					 | 
				
			||||||
    summary: TODO get material details
 | 
					 | 
				
			||||||
    description: 'Auth: all, levels: read, write, maintain, dev, admin'
 | 
					 | 
				
			||||||
    tags:
 | 
					 | 
				
			||||||
      - /material
 | 
					 | 
				
			||||||
    responses:
 | 
					 | 
				
			||||||
      200:
 | 
					 | 
				
			||||||
        description: created material
 | 
					 | 
				
			||||||
        content:
 | 
					 | 
				
			||||||
          application/json:
 | 
					 | 
				
			||||||
            schema:
 | 
					 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Material'
 | 
					 | 
				
			||||||
      400:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					 | 
				
			||||||
      401:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					 | 
				
			||||||
      500:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					 | 
				
			||||||
  put:
 | 
					 | 
				
			||||||
    summary: TODO add/change material
 | 
					 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					 | 
				
			||||||
    tags:
 | 
					 | 
				
			||||||
      - /material
 | 
					 | 
				
			||||||
    security:
 | 
					 | 
				
			||||||
      - BasicAuth: []
 | 
					 | 
				
			||||||
    requestBody:
 | 
					 | 
				
			||||||
      required: true
 | 
					 | 
				
			||||||
      content:
 | 
					 | 
				
			||||||
        application/json:
 | 
					 | 
				
			||||||
          schema:
 | 
					 | 
				
			||||||
            $ref: 'oas.yaml#/components/schemas/Material'
 | 
					 | 
				
			||||||
    responses:
 | 
					 | 
				
			||||||
      200:
 | 
					 | 
				
			||||||
        description: material details
 | 
					 | 
				
			||||||
        content:
 | 
					 | 
				
			||||||
          application/json:
 | 
					 | 
				
			||||||
            schema:
 | 
					 | 
				
			||||||
              $ref: 'oas.yaml#/components/schemas/Material'
 | 
					 | 
				
			||||||
      400:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					 | 
				
			||||||
      401:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					 | 
				
			||||||
      403:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					 | 
				
			||||||
      500:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					 | 
				
			||||||
  delete:
 | 
					 | 
				
			||||||
    summary: TODO delete material
 | 
					 | 
				
			||||||
    description: 'Auth: basic, levels: write, maintain, dev, admin'
 | 
					 | 
				
			||||||
    tags:
 | 
					 | 
				
			||||||
      - /material
 | 
					 | 
				
			||||||
    security:
 | 
					 | 
				
			||||||
      - BasicAuth: []
 | 
					 | 
				
			||||||
    responses:
 | 
					 | 
				
			||||||
      200:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/Ok'
 | 
					 | 
				
			||||||
      400:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/400'
 | 
					 | 
				
			||||||
      401:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/401'
 | 
					 | 
				
			||||||
      403:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/403'
 | 
					 | 
				
			||||||
      500:
 | 
					 | 
				
			||||||
        $ref: 'oas.yaml#/components/responses/500'
 | 
					 | 
				
			||||||
@@ -5,8 +5,9 @@ import db from "../db";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export default class TestHelper {
 | 
					export default class TestHelper {
 | 
				
			||||||
  public static auth = {
 | 
					  public static auth = {
 | 
				
			||||||
    admin: {pass: 'Abc123!#', key: '5ea131671feb9c2ee0aafc9a'},
 | 
					    admin: {pass: 'Abc123!#', key: '000000000000000000001003'},
 | 
				
			||||||
    janedoe: {pass: 'Xyz890*)', key: '5ea0450ed851c30a90e70899'}
 | 
					    janedoe: {pass: 'Xyz890*)', key: '000000000000000000001002'},
 | 
				
			||||||
 | 
					    user: {pass: 'Xyz890*)', key: '000000000000000000001001'}
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  public static res = {
 | 
					  public static res = {
 | 
				
			||||||
    400: {status: 'Bad request'},
 | 
					    400: {status: 'Bad request'},
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/index.ts
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/index.ts
									
									
									
									
									
								
							@@ -46,16 +46,17 @@ app.use(require('./helpers/authorize'));  // handle authentication
 | 
				
			|||||||
// require routes
 | 
					// require routes
 | 
				
			||||||
app.use('/', require('./routes/root'));
 | 
					app.use('/', require('./routes/root'));
 | 
				
			||||||
app.use('/', require('./routes/user'));
 | 
					app.use('/', require('./routes/user'));
 | 
				
			||||||
 | 
					app.use('/', require('./routes/material'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Swagger UI
 | 
					// Swagger UI
 | 
				
			||||||
let oasDoc: JSONSchema = {};
 | 
					let apiDoc: JSONSchema = {};
 | 
				
			||||||
jsonRefParser.bundle('oas/oas.yaml', (err, doc) => {
 | 
					jsonRefParser.bundle('api/api.yaml', (err, doc) => {
 | 
				
			||||||
  if(err) throw err;
 | 
					  if(err) throw err;
 | 
				
			||||||
  oasDoc = doc;
 | 
					  apiDoc = doc;
 | 
				
			||||||
  oasDoc.paths = oasDoc.paths.allOf.reduce((s, e) => Object.assign(s, e));
 | 
					  apiDoc.paths = apiDoc.paths.allOf.reduce((s, e) => Object.assign(s, e));
 | 
				
			||||||
  swagger.setup(oasDoc, {defaultModelsExpandDepth: -1, customCss: '.swagger-ui .topbar { display: none }'});
 | 
					  swagger.setup(apiDoc, {defaultModelsExpandDepth: -1, customCss: '.swagger-ui .topbar { display: none }'});
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
app.use('/api', swagger.serve, swagger.setup(oasDoc, {defaultModelsExpandDepth: -1, customCss: '.swagger-ui .topbar { display: none }'}));
 | 
					app.use('/api', swagger.serve, swagger.setup(apiDoc, {defaultModelsExpandDepth: -1, customCss: '.swagger-ui .topbar { display: none }'}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.use((req, res) => {  // 404 error handling
 | 
					app.use((req, res) => {  // 404 error handling
 | 
				
			||||||
  res.status(404).json({status: 'Not found'});
 | 
					  res.status(404).json({status: 'Not found'});
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										16
									
								
								src/models/material.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/models/material.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					import mongoose from 'mongoose';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const MaterialSchema = new mongoose.Schema({
 | 
				
			||||||
 | 
					  name: {type: String, index: {unique: true}},
 | 
				
			||||||
 | 
					  supplier: String,
 | 
				
			||||||
 | 
					  group: String,
 | 
				
			||||||
 | 
					  mineral: String,
 | 
				
			||||||
 | 
					  glass_fiber: String,
 | 
				
			||||||
 | 
					  carbon_fiber: String,
 | 
				
			||||||
 | 
					  numbers: [{
 | 
				
			||||||
 | 
					    color: String,
 | 
				
			||||||
 | 
					    number: Number
 | 
				
			||||||
 | 
					  }]
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default mongoose.model('material', MaterialSchema);
 | 
				
			||||||
							
								
								
									
										387
									
								
								src/routes/material.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										387
									
								
								src/routes/material.spec.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,387 @@
 | 
				
			|||||||
 | 
					import should from 'should/as-function';
 | 
				
			||||||
 | 
					import MaterialModel from '../models/material';
 | 
				
			||||||
 | 
					import TestHelper from "../helpers/test";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('/material', () => {
 | 
				
			||||||
 | 
					  let server;
 | 
				
			||||||
 | 
					  before(done => TestHelper.before(done));
 | 
				
			||||||
 | 
					  beforeEach(done => server = TestHelper.beforeEach(server, done));
 | 
				
			||||||
 | 
					  afterEach(done => TestHelper.afterEach(server, done));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('GET /materials', () => {
 | 
				
			||||||
 | 
					    it('returns all materials', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/materials',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200
 | 
				
			||||||
 | 
					      }).end((err, res) => {
 | 
				
			||||||
 | 
					        if (err) return done(err);
 | 
				
			||||||
 | 
					        const json = require('../test/db.json');
 | 
				
			||||||
 | 
					        should(res.body).have.lengthOf(json.collections.users.length);
 | 
				
			||||||
 | 
					        should(res.body).matchEach(material => {
 | 
				
			||||||
 | 
					          should(material).have.only.keys('_id', 'name', 'supplier', 'group', 'mineral', 'glass_fiber', 'carbon_fiber', 'numbers');
 | 
				
			||||||
 | 
					          should(material).have.property('_id').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('name').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('supplier').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('group').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('mineral').be.type('number');
 | 
				
			||||||
 | 
					          should(material).have.property('glass_fiber').be.type('number');
 | 
				
			||||||
 | 
					          should(material).have.property('carbon_fiber').be.type('number');
 | 
				
			||||||
 | 
					          should(material.numbers).matchEach(number => {
 | 
				
			||||||
 | 
					            should(number).have.only.keys('color', 'number');
 | 
				
			||||||
 | 
					            should(number).have.property('color').be.type('string');
 | 
				
			||||||
 | 
					            should(number).have.property('number').be.type('number');
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        done();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('works with an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/materials',
 | 
				
			||||||
 | 
					        auth: {key: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200
 | 
				
			||||||
 | 
					      }).end((err, res) => {
 | 
				
			||||||
 | 
					        if (err) return done(err);
 | 
				
			||||||
 | 
					        const json = require('../test/db.json');
 | 
				
			||||||
 | 
					        should(res.body).have.lengthOf(json.collections.users.length);
 | 
				
			||||||
 | 
					        should(res.body).matchEach(material => {
 | 
				
			||||||
 | 
					          should(material).have.only.keys('_id', 'name', 'supplier', 'group', 'mineral', 'glass_fiber', 'carbon_fiber', 'numbers');
 | 
				
			||||||
 | 
					          should(material).have.property('_id').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('name').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('supplier').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('group').be.type('string');
 | 
				
			||||||
 | 
					          should(material).have.property('mineral').be.type('number');
 | 
				
			||||||
 | 
					          should(material).have.property('glass_fiber').be.type('number');
 | 
				
			||||||
 | 
					          should(material).have.property('carbon_fiber').be.type('number');
 | 
				
			||||||
 | 
					          should(material.numbers).matchEach(number => {
 | 
				
			||||||
 | 
					            should(number).have.only.keys('color', 'number');
 | 
				
			||||||
 | 
					            should(number).have.property('color').be.type('string');
 | 
				
			||||||
 | 
					            should(number).have.property('number').be.type('number');
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        done();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/materials',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('GET /material/{id}', () => {
 | 
				
			||||||
 | 
					    it('returns the right material', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        res: {_id: '100000000000000000000001', name: 'Stanyl TW 200 F8', supplier: 'DSM', group: 'PA46', mineral: 0, glass_fiber: 40, carbon_fiber: 0, numbers: [{color: 'black', number: 5514263423}]}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('returns the right material for an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000003',
 | 
				
			||||||
 | 
					        auth: {key: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        res: {_id: '100000000000000000000003', name: 'PA GF 50 black (2706)', supplier: 'Akro-Plastic', group: 'PA66+PA6I/6T', mineral: 0, glass_fiber: 0, carbon_fiber: 0, numbers: []}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an invalid id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/material/10000000000000000000000x',
 | 
				
			||||||
 | 
					        auth: {key: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 404
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an unknown id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000111',
 | 
				
			||||||
 | 
					        auth: {key: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 404
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('PUT /material/{id}', () => {
 | 
				
			||||||
 | 
					    it('returns the right material', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        req: {},
 | 
				
			||||||
 | 
					        res: {_id: '100000000000000000000001', name: 'Stanyl TW 200 F8', supplier: 'DSM', group: 'PA46', mineral: 0, glass_fiber: 40, carbon_fiber: 0, numbers: [{color: 'black', number: 5514263423}]}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('changes the given properties', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        req: {name: 'UltramidTKR4355G7_2', supplier: 'BASF', group: 'PA6/6T', mineral: 0, glass_fiber: 35, carbon_fiber: 0, numbers: [{color: 'black', number: 5514212901}, {color: 'signalviolet', number: 5514612901}]}
 | 
				
			||||||
 | 
					        ,
 | 
				
			||||||
 | 
					      }).end(err => {
 | 
				
			||||||
 | 
					        if (err) return done(err);
 | 
				
			||||||
 | 
					        MaterialModel.findById('100000000000000000000001').lean().exec((err, data) => {
 | 
				
			||||||
 | 
					          if (err) return done(err);
 | 
				
			||||||
 | 
					          should(data).be.eql({_id: '100000000000000000000002', name: 'UltramidTKR4355G7', supplier: 'BASF', group: 'PA6/6T', mineral: 0, glass_fiber: 35, carbon_fiber: 0, numbers: [{color: 'black', number: 5514212901}, {color: 'signalviolet', number: 5514612901}], __v: 0}
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					          done();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects already existing material names', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        req: {name: 'UltramidTKR4355G7'},
 | 
				
			||||||
 | 
					        res: {status: 'Material name already taken'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects wrong material properties', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        req: {mineral: 'x', glass_fiber: 'x', carbon_fiber: 'x', numbers: [{colorxx: 'black', number: 'xxx'}]},
 | 
				
			||||||
 | 
					        res: {status: 'Invalid body format'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an invalid id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/10000000000000000000000x',
 | 
				
			||||||
 | 
					        auth: {basic: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        req: {},
 | 
				
			||||||
 | 
					        res: {status: 'Invalid id'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000002',
 | 
				
			||||||
 | 
					        auth: {key: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 401,
 | 
				
			||||||
 | 
					        req: {}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects requests from a read user', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000002',
 | 
				
			||||||
 | 
					        auth: {basic: 'user'},
 | 
				
			||||||
 | 
					        httpStatus: 403,
 | 
				
			||||||
 | 
					        req: {}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('returns 404 for an unknown material', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000111',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 404,
 | 
				
			||||||
 | 
					        req: {}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        httpStatus: 401,
 | 
				
			||||||
 | 
					        req: {}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('DELETE /material/{id}', () => {
 | 
				
			||||||
 | 
					    it('deletes the material', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200
 | 
				
			||||||
 | 
					      }).end((err, res) => {
 | 
				
			||||||
 | 
					        if (err) return done(err);
 | 
				
			||||||
 | 
					        should(res.body).be.eql({status: 'OK'});
 | 
				
			||||||
 | 
					        MaterialModel.findById('100000000000000000000001').lean().exec((err, data) => {
 | 
				
			||||||
 | 
					          if (err) return done(err);
 | 
				
			||||||
 | 
					          should(data).have.lengthOf(0);
 | 
				
			||||||
 | 
					          done();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects deleting a material referenced by samples');
 | 
				
			||||||
 | 
					    it('rejects an invalid id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/material/10000000000000000000000x',
 | 
				
			||||||
 | 
					        auth: {basic: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        res: {status: 'Invalid id'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000002',
 | 
				
			||||||
 | 
					        auth: {key: 'admin'},
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects requests from a read user', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000002',
 | 
				
			||||||
 | 
					        auth: {basic: 'user'},
 | 
				
			||||||
 | 
					        httpStatus: 403
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('returns 404 for an unknown id', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000111',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 404
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/material/100000000000000000000001',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('POST /material/new', () => {
 | 
				
			||||||
 | 
					    it('returns the right material', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510', supplier: 'Du Pont', group: 'PBT', mineral: 0, glass_fiber: 30, carbon_fiber: 0, numbers: [{color: 'black', number: 5515798402}]}
 | 
				
			||||||
 | 
					      }).end((err, res) => {
 | 
				
			||||||
 | 
					        if (err) return done (err);
 | 
				
			||||||
 | 
					        console.log(res.body);
 | 
				
			||||||
 | 
					        should(res.body).have.only.keys('_id', 'name', 'supplier', 'group', 'mineral', 'glass_fiber', 'carbon_fiber', 'numbers');
 | 
				
			||||||
 | 
					        should(res.body).have.property('_id').be.type('string');
 | 
				
			||||||
 | 
					        should(res.body).have.property('name', 'Crastin CE 2510');
 | 
				
			||||||
 | 
					        should(res.body).have.property('supplier', 'Du Pont');
 | 
				
			||||||
 | 
					        should(res.body).have.property('group', 'PBT');
 | 
				
			||||||
 | 
					        should(res.body).have.property('mineral', 0);
 | 
				
			||||||
 | 
					        should(res.body).have.property('glass_fiber', 30);
 | 
				
			||||||
 | 
					        should(res.body).have.property('carbon_fiber', 0);
 | 
				
			||||||
 | 
					        should(res.body.numbers).matchEach(number => {
 | 
				
			||||||
 | 
					          should(number).have.only.keys('color', 'number');
 | 
				
			||||||
 | 
					          should(number).have.property('color', 'black');
 | 
				
			||||||
 | 
					          should(number).have.property('number', 5515798402);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        done();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('stores the material', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510', supplier: 'Du Pont', group: 'PBT', mineral: 0, glass_fiber: 30, carbon_fiber: 0, numbers: []}
 | 
				
			||||||
 | 
					      }).end(err => {
 | 
				
			||||||
 | 
					        if (err) return done (err);
 | 
				
			||||||
 | 
					        MaterialModel.find({name: 'Crastin CE 2510'}).lean().exec((err, data: any) => {
 | 
				
			||||||
 | 
					          if (err) return done (err);
 | 
				
			||||||
 | 
					          console.log(data[0]);
 | 
				
			||||||
 | 
					          should(data[0]).have.only.keys('_id', 'name', 'supplier', 'group', 'mineral', 'glass_fiber', 'carbon_fiber', 'numbers', '__v');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('_id');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('name', 'Crastin CE 2510');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('supplier', 'Du Pont');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('group', 'PBT');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('mineral', '0');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('glass_fiber', '30');
 | 
				
			||||||
 | 
					          should(data[0]).have.property('carbon_fiber', '0');
 | 
				
			||||||
 | 
					          should(data[0].numbers).have.lengthOf(0);
 | 
				
			||||||
 | 
					          done();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects already existing material names', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        req: {name: 'Stanyl TW 200 F8', supplier: 'DSM', group: 'PA46', mineral: 0, glass_fiber: 40, carbon_fiber: 0, numbers: [{color: 'black', number: 5514263423}]},
 | 
				
			||||||
 | 
					        res: {status: 'Material name already taken'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects wrong material properties', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510', supplier: 'Du Pont', group: 'PBT', mineral: 'x', glass_fiber: 'x', carbon_fiber: 'x', numbers: [{colorxx: 'black', number: 'xxx'}]},
 | 
				
			||||||
 | 
					        res: {status: 'Invalid body format'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects incomplete material properties', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 400,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510'},
 | 
				
			||||||
 | 
					        res: {status: 'Invalid body format'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {key: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 401,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510', supplier: 'Du Pont', group: 'PBT', mineral: 0, glass_fiber: 30, carbon_fiber: 0, numbers: []}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects requests from a read user', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        auth: {basic: 'user'},
 | 
				
			||||||
 | 
					        httpStatus: 403,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510', supplier: 'Du Pont', group: 'PBT', mineral: 0, glass_fiber: 30, carbon_fiber: 0, numbers: []}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/material/new',
 | 
				
			||||||
 | 
					        httpStatus: 401,
 | 
				
			||||||
 | 
					        req: {name: 'Crastin CE 2510', supplier: 'Du Pont', group: 'PBT', mineral: 0, glass_fiber: 30, carbon_fiber: 0, numbers: []}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										59
									
								
								src/routes/material.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/routes/material.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
				
			|||||||
 | 
					import express from 'express';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import MaterialValidate from './validate/material';
 | 
				
			||||||
 | 
					import MaterialModel from '../models/material'
 | 
				
			||||||
 | 
					import IdValidate from './validate/id';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const router = express.Router();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.get('/materials', (req, res, next) => {
 | 
				
			||||||
 | 
					  if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MaterialModel.find({}).lean().exec((err, data) => {
 | 
				
			||||||
 | 
					    if(err) next(err);
 | 
				
			||||||
 | 
					    res.json(data.map(e => MaterialValidate.output(e)).filter(e => e !== null));  // validate all and filter null values from validation errors
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.get('/material/' + IdValidate.parameter(), (req, res, next) => {
 | 
				
			||||||
 | 
					  if (!req.auth(res, ['read', 'write', 'maintain', 'dev', 'admin'], 'all')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MaterialModel.findById(req.params.id).lean().exec((err, data) => {
 | 
				
			||||||
 | 
					    if(err) next(err);
 | 
				
			||||||
 | 
					    console.log(data);
 | 
				
			||||||
 | 
					    if (data) {
 | 
				
			||||||
 | 
					      res.json(MaterialValidate.output(data));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      res.status(404).json({status: 'Not found'});
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.post('/material/new', (req, res, next) => {
 | 
				
			||||||
 | 
					  if (!req.auth(res, ['write', 'maintain', 'dev', 'admin'], 'basic')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // validate input
 | 
				
			||||||
 | 
					  const {error, value: material} = MaterialValidate.input(req.body, 'new');
 | 
				
			||||||
 | 
					  if(error !== undefined) {
 | 
				
			||||||
 | 
					    res.status(400).json({status: 'Invalid body format'});
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  MaterialModel.find({name: material.name}).lean().exec((err, data) => {
 | 
				
			||||||
 | 
					    if(err) next(err);
 | 
				
			||||||
 | 
					    if (data.length > 0) {
 | 
				
			||||||
 | 
					      res.status(400).json({status: 'Material name already taken'});
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new MaterialModel(material).save((err, data) => {
 | 
				
			||||||
 | 
					      if(err) next(err);
 | 
				
			||||||
 | 
					      res.json(MaterialValidate.output(data.toObject()));
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = router;
 | 
				
			||||||
@@ -48,6 +48,13 @@ describe('/user', () => {
 | 
				
			|||||||
        httpStatus: 401
 | 
					        httpStatus: 401
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/users',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('GET /user/{name}', () => {
 | 
					  describe('GET /user/{name}', () => {
 | 
				
			||||||
@@ -119,6 +126,13 @@ describe('/user', () => {
 | 
				
			|||||||
        httpStatus: 404
 | 
					        httpStatus: 404
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects requests from an admin API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/user/janedoe',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('PUT /user/{name}', () => {
 | 
					  describe('PUT /user/{name}', () => {
 | 
				
			||||||
@@ -169,7 +183,7 @@ describe('/user', () => {
 | 
				
			|||||||
        req: {name: 'adminnew', email: 'adminnew@bosch.com', pass: 'Abc123##', location: 'Abt', device_name: 'test'}
 | 
					        req: {name: 'adminnew', email: 'adminnew@bosch.com', pass: 'Abc123##', location: 'Abt', device_name: 'test'}
 | 
				
			||||||
      }).end(err => {
 | 
					      }).end(err => {
 | 
				
			||||||
          if (err) return done (err);
 | 
					          if (err) return done (err);
 | 
				
			||||||
          UserModel.find({name: 'adminnew'}).lean().exec( 'find', (err, data) => {
 | 
					          UserModel.find({name: 'adminnew'}).lean().exec( (err, data) => {
 | 
				
			||||||
            if (err) return done(err);
 | 
					            if (err) return done(err);
 | 
				
			||||||
            should(data).have.lengthOf(1);
 | 
					            should(data).have.lengthOf(1);
 | 
				
			||||||
            should(data[0]).have.only.keys('_id', 'name', 'pass', 'email', 'level', 'location', 'device_name', 'key', '__v');
 | 
					            should(data[0]).have.only.keys('_id', 'name', 'pass', 'email', 'level', 'location', 'device_name', 'key', '__v');
 | 
				
			||||||
@@ -193,7 +207,7 @@ describe('/user', () => {
 | 
				
			|||||||
        req: {level: 'read'}
 | 
					        req: {level: 'read'}
 | 
				
			||||||
      }).end(err => {
 | 
					      }).end(err => {
 | 
				
			||||||
          if (err) return done (err);
 | 
					          if (err) return done (err);
 | 
				
			||||||
          UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data) => {
 | 
					          UserModel.find({name: 'janedoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
            if (err) return done(err);
 | 
					            if (err) return done(err);
 | 
				
			||||||
            should(data).have.lengthOf(1);
 | 
					            should(data).have.lengthOf(1);
 | 
				
			||||||
            should(data[0]).have.property('level', 'read');
 | 
					            should(data[0]).have.property('level', 'read');
 | 
				
			||||||
@@ -211,7 +225,7 @@ describe('/user', () => {
 | 
				
			|||||||
      }).end((err, res) => {
 | 
					      }).end((err, res) => {
 | 
				
			||||||
          if (err) return done (err);
 | 
					          if (err) return done (err);
 | 
				
			||||||
          should(res.body).be.eql({status: 'Invalid body format'});
 | 
					          should(res.body).be.eql({status: 'Invalid body format'});
 | 
				
			||||||
          UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data) => {
 | 
					          UserModel.find({name: 'janedoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
            if (err) return done(err);
 | 
					            if (err) return done(err);
 | 
				
			||||||
            should(data).have.lengthOf(1);
 | 
					            should(data).have.lengthOf(1);
 | 
				
			||||||
            should(data[0]).have.property('level', 'write');
 | 
					            should(data[0]).have.property('level', 'write');
 | 
				
			||||||
@@ -229,7 +243,7 @@ describe('/user', () => {
 | 
				
			|||||||
      }).end((err, res) => {
 | 
					      }).end((err, res) => {
 | 
				
			||||||
          if (err) return done (err);
 | 
					          if (err) return done (err);
 | 
				
			||||||
          should(res.body).be.eql({status: 'Username already taken'});
 | 
					          should(res.body).be.eql({status: 'Username already taken'});
 | 
				
			||||||
          UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data) => {
 | 
					          UserModel.find({name: 'janedoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
            if (err) return done(err);
 | 
					            if (err) return done(err);
 | 
				
			||||||
            should(data).have.lengthOf(1);
 | 
					            should(data).have.lengthOf(1);
 | 
				
			||||||
            done();
 | 
					            done();
 | 
				
			||||||
@@ -312,6 +326,14 @@ describe('/user', () => {
 | 
				
			|||||||
        req: {}
 | 
					        req: {}
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'put',
 | 
				
			||||||
 | 
					        url: '/user/janedoe',
 | 
				
			||||||
 | 
					        httpStatus: 401,
 | 
				
			||||||
 | 
					        req: {}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('DELETE /user/{name}', () => {
 | 
					  describe('DELETE /user/{name}', () => {
 | 
				
			||||||
@@ -324,7 +346,7 @@ describe('/user', () => {
 | 
				
			|||||||
      }).end((err, res) => {
 | 
					      }).end((err, res) => {
 | 
				
			||||||
        if (err) return done (err);
 | 
					        if (err) return done (err);
 | 
				
			||||||
        should(res.body).be.eql({status: 'OK'});
 | 
					        should(res.body).be.eql({status: 'OK'});
 | 
				
			||||||
        UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data) => {
 | 
					        UserModel.find({name: 'janedoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
          if (err) return done(err);
 | 
					          if (err) return done(err);
 | 
				
			||||||
          should(data).have.lengthOf(0);
 | 
					          should(data).have.lengthOf(0);
 | 
				
			||||||
          done();
 | 
					          done();
 | 
				
			||||||
@@ -340,7 +362,7 @@ describe('/user', () => {
 | 
				
			|||||||
      }).end((err, res) => {
 | 
					      }).end((err, res) => {
 | 
				
			||||||
        if (err) return done (err);
 | 
					        if (err) return done (err);
 | 
				
			||||||
        should(res.body).be.eql({status: 'OK'});
 | 
					        should(res.body).be.eql({status: 'OK'});
 | 
				
			||||||
        UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data) => {
 | 
					        UserModel.find({name: 'janedoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
          if (err) return done(err);
 | 
					          if (err) return done(err);
 | 
				
			||||||
          should(data).have.lengthOf(0);
 | 
					          should(data).have.lengthOf(0);
 | 
				
			||||||
          done();
 | 
					          done();
 | 
				
			||||||
@@ -379,6 +401,40 @@ describe('/user', () => {
 | 
				
			|||||||
        httpStatus: 404
 | 
					        httpStatus: 404
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'delete',
 | 
				
			||||||
 | 
					        url: '/user/janedoe',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  describe('GET /user/key', () => {
 | 
				
			||||||
 | 
					    it('returns the right API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/user/key',
 | 
				
			||||||
 | 
					        auth: {basic: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 200,
 | 
				
			||||||
 | 
					        res: {key: TestHelper.auth.janedoe.key}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects requests from an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/user/key',
 | 
				
			||||||
 | 
					        auth: {key: 'janedoe'},
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects requests from an API key', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'get',
 | 
				
			||||||
 | 
					        url: '/user/key',
 | 
				
			||||||
 | 
					        httpStatus: 401
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('POST /user/new', () => {
 | 
					  describe('POST /user/new', () => {
 | 
				
			||||||
@@ -410,7 +466,7 @@ describe('/user', () => {
 | 
				
			|||||||
        req: {email: 'john.doe@bosch.com', name: 'johndoe', pass: 'Abc123!#', level: 'read', location: 'Rng', device_name: 'Alpha II'}
 | 
					        req: {email: 'john.doe@bosch.com', name: 'johndoe', pass: 'Abc123!#', level: 'read', location: 'Rng', device_name: 'Alpha II'}
 | 
				
			||||||
      }).end(err => {
 | 
					      }).end(err => {
 | 
				
			||||||
          if (err) return done (err);
 | 
					          if (err) return done (err);
 | 
				
			||||||
          UserModel.find({name: 'johndoe'}).lean().exec( 'find', (err, data) => {
 | 
					          UserModel.find({name: 'johndoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
            if (err) return done(err);
 | 
					            if (err) return done(err);
 | 
				
			||||||
            should(data).have.lengthOf(1);
 | 
					            should(data).have.lengthOf(1);
 | 
				
			||||||
            should(data[0]).have.only.keys('_id', 'name', 'pass', 'email', 'level', 'location', 'device_name', 'key', '__v');
 | 
					            should(data[0]).have.only.keys('_id', 'name', 'pass', 'email', 'level', 'location', 'device_name', 'key', '__v');
 | 
				
			||||||
@@ -435,7 +491,7 @@ describe('/user', () => {
 | 
				
			|||||||
      }).end((err, res) => {
 | 
					      }).end((err, res) => {
 | 
				
			||||||
          if (err) return done (err);
 | 
					          if (err) return done (err);
 | 
				
			||||||
          should(res.body).be.eql({status: 'Username already taken'});
 | 
					          should(res.body).be.eql({status: 'Username already taken'});
 | 
				
			||||||
          UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data) => {
 | 
					          UserModel.find({name: 'janedoe'}).lean().exec( (err, data) => {
 | 
				
			||||||
            if (err) return done(err);
 | 
					            if (err) return done(err);
 | 
				
			||||||
            should(data).have.lengthOf(1);
 | 
					            should(data).have.lengthOf(1);
 | 
				
			||||||
            done();
 | 
					            done();
 | 
				
			||||||
@@ -510,6 +566,14 @@ describe('/user', () => {
 | 
				
			|||||||
        req: {email: 'john.doe@bosch.com', name: 'johndoe', pass: 'Abc123!#', level: 'read', location: 'Rng', device_name: 'Alpha II'}
 | 
					        req: {email: 'john.doe@bosch.com', name: 'johndoe', pass: 'Abc123!#', level: 'read', location: 'Rng', device_name: 'Alpha II'}
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					    it('rejects unauthorized requests', done => {
 | 
				
			||||||
 | 
					      TestHelper.request(server, done, {
 | 
				
			||||||
 | 
					        method: 'post',
 | 
				
			||||||
 | 
					        url: '/user/new',
 | 
				
			||||||
 | 
					        httpStatus: 401,
 | 
				
			||||||
 | 
					        req: {email: 'john.doe@bosch.com', name: 'johndoe', pass: 'Abc123!#', level: 'read', location: 'Rng', device_name: 'Alpha II'}
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  describe('POST /user/passreset', () => {
 | 
					  describe('POST /user/passreset', () => {
 | 
				
			||||||
@@ -539,7 +603,7 @@ describe('/user', () => {
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    it('changes the user password', done => {
 | 
					    it('changes the user password', done => {
 | 
				
			||||||
      UserModel.find({name: 'janedoe'}).lean().exec( 'find', (err, data: any) => {
 | 
					      UserModel.find({name: 'janedoe'}).lean().exec( (err, data: any) => {
 | 
				
			||||||
        if (err) return done(err);
 | 
					        if (err) return done(err);
 | 
				
			||||||
        const oldpass = data[0].pass;
 | 
					        const oldpass = data[0].pass;
 | 
				
			||||||
        TestHelper.request(server, done, {
 | 
					        TestHelper.request(server, done, {
 | 
				
			||||||
@@ -559,24 +623,4 @@ describe('/user', () => {
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					 | 
				
			||||||
  describe('GET /user/key', () => {
 | 
					 | 
				
			||||||
    it('returns the right API key', done => {
 | 
					 | 
				
			||||||
      TestHelper.request(server, done, {
 | 
					 | 
				
			||||||
        method: 'get',
 | 
					 | 
				
			||||||
        url: '/user/key',
 | 
					 | 
				
			||||||
        auth: {basic: 'janedoe'},
 | 
					 | 
				
			||||||
        httpStatus: 200,
 | 
					 | 
				
			||||||
        res: {key: TestHelper.auth.janedoe.key}
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
    it('rejects requests from an API key', done => {
 | 
					 | 
				
			||||||
      TestHelper.request(server, done, {
 | 
					 | 
				
			||||||
        method: 'get',
 | 
					 | 
				
			||||||
        url: '/user/key',
 | 
					 | 
				
			||||||
        auth: {key: 'janedoe'},
 | 
					 | 
				
			||||||
        httpStatus: 401
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
@@ -1,12 +1,14 @@
 | 
				
			|||||||
import express from 'express';
 | 
					import express from 'express';
 | 
				
			||||||
import mongoose from 'mongoose';
 | 
					import mongoose from 'mongoose';
 | 
				
			||||||
import bcrypt from 'bcryptjs';
 | 
					import bcrypt from 'bcryptjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import UserValidate from './validate/user';
 | 
					import UserValidate from './validate/user';
 | 
				
			||||||
import UserModel from '../models/user';
 | 
					import UserModel from '../models/user';
 | 
				
			||||||
import mail from '../helpers/mail';
 | 
					import mail from '../helpers/mail';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const router = express.Router();
 | 
					const router = express.Router();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router.get('/users', (req, res) => {
 | 
					router.get('/users', (req, res) => {
 | 
				
			||||||
  if (!req.auth(res, ['admin'], 'basic')) return;
 | 
					  if (!req.auth(res, ['admin'], 'basic')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -168,4 +170,5 @@ router.post('/user/passreset', (req, res, next) => {
 | 
				
			|||||||
  });
 | 
					  });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = router;
 | 
					module.exports = router;
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/routes/validate/id.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/routes/validate/id.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					import joi from '@hapi/joi';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class IdValidate {
 | 
				
			||||||
 | 
					  private static id = joi.string().pattern(new RegExp('[0-9a-f]{24}')).length(24);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static get () {
 | 
				
			||||||
 | 
					    return this.id;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static valid (id) {
 | 
				
			||||||
 | 
					    return this.id.validate(id).error === undefined;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static parameter() {  // :id url parameter
 | 
				
			||||||
 | 
					    return ':id([0-9a-f]{24})';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										82
									
								
								src/routes/validate/material.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src/routes/validate/material.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					import joi from '@hapi/joi';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import IdValidate from './id';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default class MaterialValidate {  // validate input for material
 | 
				
			||||||
 | 
					  private static material = {
 | 
				
			||||||
 | 
					    name: joi.string()
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    supplier: joi.string()
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    group: joi.string()
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mineral: joi.number()
 | 
				
			||||||
 | 
					      .integer()
 | 
				
			||||||
 | 
					      .min(0)
 | 
				
			||||||
 | 
					      .max(100),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glass_fiber: joi.number()
 | 
				
			||||||
 | 
					      .integer()
 | 
				
			||||||
 | 
					      .min(0)
 | 
				
			||||||
 | 
					      .max(100),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    carbon_fiber: joi.number()
 | 
				
			||||||
 | 
					      .integer()
 | 
				
			||||||
 | 
					      .min(0)
 | 
				
			||||||
 | 
					      .max(100),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    numbers: joi.array()
 | 
				
			||||||
 | 
					      .items(joi.object({
 | 
				
			||||||
 | 
					        color: joi.string()
 | 
				
			||||||
 | 
					          .max(128),
 | 
				
			||||||
 | 
					        number: joi.number()
 | 
				
			||||||
 | 
					          .min(0)
 | 
				
			||||||
 | 
					      }))
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static input (data, param) {  // validate data, param: new(everything required)/change(available attributes are validated)
 | 
				
			||||||
 | 
					    if (param === 'new') {
 | 
				
			||||||
 | 
					      return joi.object({
 | 
				
			||||||
 | 
					        name: this.material.name.required(),
 | 
				
			||||||
 | 
					        supplier: this.material.supplier.required(),
 | 
				
			||||||
 | 
					        group: this.material.group.required(),
 | 
				
			||||||
 | 
					        mineral: this.material.mineral.required(),
 | 
				
			||||||
 | 
					        glass_fiber: this.material.glass_fiber.required(),
 | 
				
			||||||
 | 
					        carbon_fiber: this.material.carbon_fiber.required(),
 | 
				
			||||||
 | 
					        numbers: this.material.numbers
 | 
				
			||||||
 | 
					      }).validate(data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (param === 'change') {
 | 
				
			||||||
 | 
					      return joi.object({
 | 
				
			||||||
 | 
					        name: this.material.name,
 | 
				
			||||||
 | 
					        supplier: this.material.supplier,
 | 
				
			||||||
 | 
					        group: this.material.group,
 | 
				
			||||||
 | 
					        mineral: this.material.mineral,
 | 
				
			||||||
 | 
					        glass_fiber: this.material.glass_fiber,
 | 
				
			||||||
 | 
					        carbon_fiber: this.material.carbon_fiber,
 | 
				
			||||||
 | 
					        numbers: this.material.numbers
 | 
				
			||||||
 | 
					      }).validate(data);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else {
 | 
				
			||||||
 | 
					      return{error: 'No parameter specified!', value: {}};
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  static output (data) {  // validate output from database for needed properties, strip everything else
 | 
				
			||||||
 | 
					    data._id = data._id.toString();
 | 
				
			||||||
 | 
					    const {value, error} = joi.object({
 | 
				
			||||||
 | 
					      _id: IdValidate.get(),
 | 
				
			||||||
 | 
					      name: this.material.name,
 | 
				
			||||||
 | 
					      supplier: this.material.supplier,
 | 
				
			||||||
 | 
					      group: this.material.group,
 | 
				
			||||||
 | 
					      mineral: this.material.mineral,
 | 
				
			||||||
 | 
					      glass_fiber: this.material.glass_fiber,
 | 
				
			||||||
 | 
					      carbon_fiber: this.material.carbon_fiber,
 | 
				
			||||||
 | 
					      numbers: this.material.numbers
 | 
				
			||||||
 | 
					    }).validate(data, {stripUnknown: true});
 | 
				
			||||||
 | 
					    return error !== undefined? null : value;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,28 +1,34 @@
 | 
				
			|||||||
import joi from '@hapi/joi';
 | 
					import joi from '@hapi/joi';
 | 
				
			||||||
import globals from '../../globals';
 | 
					import globals from '../../globals';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import IdValidate from './id';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class UserValidate {  // validate input for user
 | 
					export default class UserValidate {  // validate input for user
 | 
				
			||||||
  private static user = {
 | 
					  private static user = {
 | 
				
			||||||
    _id: joi.any(),
 | 
					 | 
				
			||||||
    name: joi.string()
 | 
					    name: joi.string()
 | 
				
			||||||
      .alphanum()
 | 
					      .alphanum()
 | 
				
			||||||
      .lowercase(),
 | 
					      .lowercase()
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    email: joi.string()
 | 
					    email: joi.string()
 | 
				
			||||||
      .email({minDomainSegments: 2})
 | 
					      .email({minDomainSegments: 2})
 | 
				
			||||||
      .lowercase(),
 | 
					      .lowercase()
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pass: joi.string()
 | 
					    pass: joi.string()
 | 
				
			||||||
      .pattern(new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!"#%&\'()*+,-.\\/:;<=>?@[\\]^_`{|}~])(?=\\S+$).{8,}$')),
 | 
					      .pattern(new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!"#%&\'()*+,-.\\/:;<=>?@[\\]^_`{|}~])(?=\\S+$).{8,}$'))
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    level: joi.string()
 | 
					    level: joi.string()
 | 
				
			||||||
      .valid(...globals.levels),
 | 
					      .valid(...globals.levels),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    location: joi.string()
 | 
					    location: joi.string()
 | 
				
			||||||
      .alphanum(),
 | 
					      .alphanum()
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    device_name: joi.string()
 | 
					    device_name: joi.string()
 | 
				
			||||||
      .allow('')
 | 
					      .allow('')
 | 
				
			||||||
 | 
					      .max(128),
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private static specialUsernames = ['admin', 'user', 'key', 'new', 'passreset'];  // names a user cannot take
 | 
					  private static specialUsernames = ['admin', 'user', 'key', 'new', 'passreset'];  // names a user cannot take
 | 
				
			||||||
@@ -63,14 +69,15 @@ export default class UserValidate {  // validate input for user
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  static output (data) {  // validate output from database for needed properties, strip everything else
 | 
					  static output (data) {  // validate output from database for needed properties, strip everything else
 | 
				
			||||||
 | 
					    data._id = data._id.toString();
 | 
				
			||||||
    const {value, error} = joi.object({
 | 
					    const {value, error} = joi.object({
 | 
				
			||||||
      _id: joi.any(),
 | 
					      _id: IdValidate.get(),
 | 
				
			||||||
      name: joi.string(),
 | 
					      name: this.user.name,
 | 
				
			||||||
      email: joi.string(),
 | 
					      email: this.user.email,
 | 
				
			||||||
      level: joi.string(),
 | 
					      level: this.user.level,
 | 
				
			||||||
      location: joi.string(),
 | 
					      location: this.user.location,
 | 
				
			||||||
      device_name: joi.string().allow('')
 | 
					      device_name: this.user.device_name
 | 
				
			||||||
    }).validate(data, {stripUnknown: true})
 | 
					    }).validate(data, {stripUnknown: true});
 | 
				
			||||||
    return error !== undefined? null : value;
 | 
					    return error !== undefined? null : value;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,27 +2,88 @@
 | 
				
			|||||||
  "collections": {
 | 
					  "collections": {
 | 
				
			||||||
    "users": [
 | 
					    "users": [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        "_id": {"$oid":"5ea0450ed851c30a90e70894"},
 | 
					        "_id": {"$oid":"000000000000000000000001"},
 | 
				
			||||||
 | 
					        "email": "user@bosch.com",
 | 
				
			||||||
 | 
					        "name": "user",
 | 
				
			||||||
 | 
					        "pass": "$2a$10$di26XKF63OG0V00PL1kSK.ceCcTxDExBMOg.jkHiCnXcY7cN7DlPi",
 | 
				
			||||||
 | 
					        "level": "read",
 | 
				
			||||||
 | 
					        "location": "Rng",
 | 
				
			||||||
 | 
					        "device_name": "Alpha I",
 | 
				
			||||||
 | 
					        "key": "000000000000000000001001",
 | 
				
			||||||
 | 
					        "__v": 0
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "_id": {"$oid":"000000000000000000000002"},
 | 
				
			||||||
        "email": "jane.doe@bosch.com",
 | 
					        "email": "jane.doe@bosch.com",
 | 
				
			||||||
        "name": "janedoe",
 | 
					        "name": "janedoe",
 | 
				
			||||||
        "pass": "$2a$10$di26XKF63OG0V00PL1kSK.ceCcTxDExBMOg.jkHiCnXcY7cN7DlPi",
 | 
					        "pass": "$2a$10$di26XKF63OG0V00PL1kSK.ceCcTxDExBMOg.jkHiCnXcY7cN7DlPi",
 | 
				
			||||||
        "level": "write",
 | 
					        "level": "write",
 | 
				
			||||||
        "location": "Rng",
 | 
					        "location": "Rng",
 | 
				
			||||||
        "device_name": "Alpha I",
 | 
					        "device_name": "Alpha I",
 | 
				
			||||||
        "key": "5ea0450ed851c30a90e70899",
 | 
					        "key": "000000000000000000001002",
 | 
				
			||||||
        "__v": 0
 | 
					        "__v": 0
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        "_id": {"$oid":"5ea131671feb9c2ee0aafc9b"},
 | 
					        "_id": {"$oid":"000000000000000000000003"},
 | 
				
			||||||
        "email": "a.d.m.i.n@bosch.com",
 | 
					        "email": "a.d.m.i.n@bosch.com",
 | 
				
			||||||
        "name": "admin",
 | 
					        "name": "admin",
 | 
				
			||||||
        "pass": "$2a$10$i872o3qR5V3JnbDArD8Z.eDo.BNPDBaR7dUX9KSEtl9pUjLyucy2K",
 | 
					        "pass": "$2a$10$i872o3qR5V3JnbDArD8Z.eDo.BNPDBaR7dUX9KSEtl9pUjLyucy2K",
 | 
				
			||||||
        "level": "admin",
 | 
					        "level": "admin",
 | 
				
			||||||
        "location": "Rng",
 | 
					        "location": "Rng",
 | 
				
			||||||
        "device_name": "",
 | 
					        "device_name": "",
 | 
				
			||||||
        "key": "5ea131671feb9c2ee0aafc9a",
 | 
					        "key": "000000000000000000001003",
 | 
				
			||||||
        "__v": "0"
 | 
					        "__v": "0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "materials": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "_id": {"$oid":"100000000000000000000001"},
 | 
				
			||||||
 | 
					        "name": "Stanyl TW 200 F8",
 | 
				
			||||||
 | 
					        "supplier": "DSM",
 | 
				
			||||||
 | 
					        "group": "PA46",
 | 
				
			||||||
 | 
					        "mineral": 0,
 | 
				
			||||||
 | 
					        "glass_fiber": 40,
 | 
				
			||||||
 | 
					        "carbon_fiber": 0,
 | 
				
			||||||
 | 
					        "numbers": [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "color": "black",
 | 
				
			||||||
 | 
					            "number": 5514263423
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "__v": 0
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "_id": {"$oid":"100000000000000000000002"},
 | 
				
			||||||
 | 
					        "name": "Ultramid T KR 4355 G7",
 | 
				
			||||||
 | 
					        "supplier": "BASF",
 | 
				
			||||||
 | 
					        "group": "PA6/6T",
 | 
				
			||||||
 | 
					        "mineral": 0,
 | 
				
			||||||
 | 
					        "glass_fiber": 35,
 | 
				
			||||||
 | 
					        "carbon_fiber": 0,
 | 
				
			||||||
 | 
					        "numbers": [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "color": "black",
 | 
				
			||||||
 | 
					            "number": 5514212901
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            "color": "signalviolet",
 | 
				
			||||||
 | 
					            "number": 5514612901
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "__v": 0
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "_id": {"$oid":"100000000000000000000003"},
 | 
				
			||||||
 | 
					        "name": "PA GF 50 black (2706)",
 | 
				
			||||||
 | 
					        "supplier": "Akro-Plastic",
 | 
				
			||||||
 | 
					        "group": "PA66+PA6I/6T",
 | 
				
			||||||
 | 
					        "mineral": 0,
 | 
				
			||||||
 | 
					        "glass_fiber": 0,
 | 
				
			||||||
 | 
					        "carbon_fiber": 0,
 | 
				
			||||||
 | 
					        "numbers": [
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					        "__v": 0
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										0
									
								
								static/styles/swagger.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								static/styles/swagger.css
									
									
									
									
									
										Normal file
									
								
							
		Reference in New Issue
	
	Block a user