
### Backend Strapi/DB Model
```dbml
//// Project

Project project_API {
  database_type: 'Strapi CMS'
}

// Create Tables
Table project {
  id int [pk, unique, not null]
  title varchar(255)
  dataUrl varchar(2083)
  url_website varchar(2083)
  objects int [ref: < objects.id]
  buildings int [ref: < buildings.id]
  phase phase_names
  mapping_default int [ref: > mappings.id]
  mapping_override int [ref: - mappings.id]
  created_at timestamp
  updated_at timestamp
}

Table mapping_defaults {
  id int [pk, unique, not null]
  title varchar(255)
  mapping int [ref: - mappings.id]
}

Table mapping_overrides {
  id int [pk, unique, not null]
  title varchar(255)
  mapping int [ref: - mappings.id]
}

Table mappings {
  id int [pk]
  title varchar(255)
  is_default boolean
  object_title varchar(255)
  object_building varchar(255)
  object_object_type varchar(255)
  object_typology varchar(255)
  object_state varchar(255)
  object_rooms varchar(255)
  object_floor_number varchar(255)
  object_floor_name varchar(255)
  object_area_living varchar(255)
  object_area_basement varchar(255)
  object_area_garden varchar(255)
  object_area_balcony varchar(255)
  object_area_loggia varchar(255)
  object_area_terrace varchar(255)
  object_area_exterior_total varchar(255)
  object_orientation varchar(255)
  object_price_gross varchar(255)
  object_price_net varchar(255)
  object_price_incidental varchar(255)
  object_building_lease_interest varchar(255)
  object_parking_space_cost varchar(255)
  object_date_start varchar(255)
  object_date_movein varchar(255)
  object_phase varchar(255)
  object_applications_count varchar(255)
  object_applications_max varchar(255)
  object_url_application varchar(255)
  object_url_floorplan varchar(255)
  object_url_factsheet varchar(255)
  object_url_furnishing varchar(255)
  object_url_vtour varchar(255)
  object_url_view varchar(255)
  object_media varchar(255)
  created_at timestamp
  updated_at timestamp
}

Table objects {
  id int [pk]
  title varchar(255)
  building id [ref: > buildings.id]
  object_type varchar(255)
  typology varchar(255)
  state states
  rooms dec
  floor_number int
  floor_name varchar(255)
  area_living dec
  area_basement dec
  area_garden dec
  area_balcony dec
  area_loggia dec
  area_terrace dec
  area_exterior_total dec
  orientation varchar(255)
  price_gross int
  price_net int
  price_incidental int
  building_lease_interest int
  parking_space_cost int
  date_start datetime
  date_movein date
  phase varchar(255)
  applications_count int
  applications_max int
  url_application varchar(2083)
  url_floorplan varchar(2083)
  url_factsheet varchar(2083)
  url_furnishing varchar(2083)
  url_tour varchar(2083)
  url_view varchar(2083)
  media int [ref: < media.id]
  created_at timestamp
  updated_at timestamp
}

Table buildings {
  id int
  title varchar(255)
  public boolean
  street varchar(255)
  house_nr varchar(8)
  plz varchar(8)
  city varchar(255)
}

Table media {
  id int [pk]
  title varchar(255)
  url varchar(2083)
}

/// ENUMS
enum states {
  free
  reserved
  taken
}

enum phase_naming {
  disabled
  numbered
  year
  season
  month
}
```

### Flow
// Update Melon\
  &nbsp;&nbsp;&nbsp;// fetch from Melon/etc\
  &nbsp;&nbsp;&nbsp;// convert from Melon/etc to ProjectData\
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// generate object with all project data, but without a hash\
  &nbsp;&nbsp;&nbsp;// processNewProjectData\
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// get ProjectDataHash for new data\
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// copy object to new one with only the data that would trigger an update\
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// generate hash from new object\
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// write hash to ProjectDataHash\
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// compare ProjectDataHash\
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// update data\
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// find existing object\
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// create or update\
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// report errors\
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// report to asana?\
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// report to mail?\

```mermaid
flowchart TD
  subgraph A[ AdminPanel ]
    a1(Start) --> a4
    a4{data_autoupdate enabled} -->|true| a3
    a4 -->|false| a2
    a3{has valid data_url} -->|true| a8
    a3 -->|false| a2
    a8[check service type:<br>melon, flatfox, etc.] --> a5
    a5[fetch data] --> a6
    a6{success} -->|true| a10
    a6 -->|false| a7
    a7[set data_autoupdate false<br>show error message in AdminPanel] --> a2
    a10[get object mapping:<br>consolidate default and custom mapping] --> a11
    a10 --> a9
    a11[convert data to internal format] --> a12
    a11 --> a9
    a12{is update/create} -->|update| a13
    a12 -->|create| a14
    a13[get existing objects/buildings related to project] --> a15
    a13 --> a9
    a15[compare existing data with new data:<br>filter] --> a14
    a15 --> a9
    a14[create object/building] --> a2
    a14 --> a9
    a9[has error] --> a7
    a2(End)
  end
  subgraph B[ API ]
  b1(Start)
  end  
```




### Setup
 - Make sure you have the [heroku installer](https://devcenter.heroku.com/articles/heroku-cli#install-the-heroku-cli) installed.
 - Add heroku as a remote:
   `heroku git:remote -a rgconfiguratorapi`

### Deployment
 - Increase the package number.
 - Select the production variables in these files:
   - /config/database.js
 - Merge your changes to master.
```
cmd
npm login
heroku login
git push heroku master

```
 - Test these links
   - https://rgconfiguratorapi.herokuapp.com/admin (Should bring you to the login)

### Change Password
 - Make sure you are on the database server you think you are.
 - npm run strapi admin:reset-user-password
