{
  "code_site_template_type": {
    "type": "code",
    "caption": "Site Template Type",
    "init_data": [
      { "code_val": "PAGE", "code_txt": "Page", "code_seq": 1 },
      { "code_val": "COMPONENT", "code_txt": "Component", "code_seq": 2 },
    ]
  },

  "code_sys_user_site_access": {
    "type": "code",
    "caption": "User Site Access",
    "init_data": [
      { "code_val": "VIEWER", "code_txt": "Viewer", "code_seq": 1 },
      { "code_val": "AUTHOR", "code_txt": "Author", "code_seq": 2 },
      { "code_val": "PUBLISHER", "code_txt": "Publisher", "code_seq": 3 },
    ]
  },

  "site": {
    "type": "table",
    "caption": ["Site","Sites"],
    "columns": [
      { "name": "site_id", "type": "bigint", "key": true, "identity": true, "null": false, "actions": ["prevent_update"] },
      { "name": "site_name", "type": "varchar", "length": 256, "null": false, "unique": true },
      { "name": "site_sts", "type": "varchar", "length": 32, "foreignkey": { "jsharmony.code_ac": "code_val" }, "null": false, "default": "ACTIVE" },
      { "name": "site_default_editor", "type": "bigint" },
      { "name": "site_default_page_template_id", "type": "varchar", "length": 255 },
      { "name": "site_default_page_filename", "type": "varchar", "length": 255, "default": "index.html", "null": false },
      { "name": "site_config", "type": "varchar", "length": -1 },
      
      { "name": "site_etstmp", "type": "datetime", "length": 7, "default": { "sql": "%%%%%%jsh.map.timestamp%%%%%%" } },
      { "name": "site_euser", "type": "varchar", "length": 20, "default": { "sql": "%%%%%%jsh.map.current_user%%%%%%" } },
      { "name": "site_mtstmp", "type": "datetime", "length": 7 },
      { "name": "site_muser", "type": "varchar", "length": 20 }
    ],
    "triggers": [
      { "on": ["validate_update", "validate_insert"], "exec": [
          "errorif((inserted(site_default_editor) is not null and inserted(site_default_editor) not in (select deployment_target_id from {schema}.deployment_target where deployment_target.site_id = inserted(site_id))),'Target Editor not available for this site')",
          "errorif((inserted(site_default_editor) is not null and inserted(site_default_editor) not in (select deployment_target_id from {schema}.deployment_target where deployment_target_sts='ACTIVE')),'Target Editor is not ACTIVE')"
        ]
      },
      { "on": ["update", "insert"], "exec": [
          "set(site_mtstmp,%%%%%%jsh.map.timestamp%%%%%%);",
          "set(site_muser,%%%%%%jsh.map.current_user%%%%%%);"
        ]
      },
      { "on": ["insert"], "exec": [
          "insert into {schema}.branch(branch_name, branch_type, branch_sts, site_id) values ('master','PUBLIC','ACTIVE',inserted(site_id))",
          "with_insert_identity(sitemap, sitemap_id, ",
          "  insert into {schema}.sitemap(site_id, sitemap_name, sitemap_type) values(inserted(site_id), 'Primary Sitemap', 'PRIMARY'),",
          "  insert into {schema}.branch_sitemap(branch_id, sitemap_key, sitemap_id, sitemap_orig_id) values((select top1(branch_id from {schema}.branch where site_id=inserted(site_id))), @@INSERT_ID, @@INSERT_ID, @@INSERT_ID);",
          "  increment_changes()",
          ")"
        ]
      },
      {
        "on": ["delete"], "exec": [
          "foreach(%%%{schema}.branch_items%%%, %%%TRIGGER_EOL%%%, \"delete from {tbl_branch_item} where branch_id in (select branch_id from {schema}.branch where site_id=deleted(site_id))\");",
          "foreach(%%%{schema}.branch_items%%%, %%%TRIGGER_EOL%%%, \"delete from {tbl_branch_item} where {item}_key in (select {item}_key from {tbl_item} where site_id=deleted(site_id))\");",
          "delete from {schema}.branch where site_id=deleted(site_id);",
          "foreach(%%%{schema}.branch_items%%%, %%%TRIGGER_EOL%%%, \"delete from {tbl_item} where site_id=deleted(site_id)\");",
        ]
      }
    ],
    "sample_data": [
      { "site_name": "Default Web Site" }
    ]
  },

  "site_template": {
    "type": "table",
    "caption": ["Site Template","Site Templates"],
    "columns": [
      { "name": "site_template_id", "type": "bigint", "key": true, "identity": true, "null": false },
      { "name": "site_id", "type": "bigint", "null": false, "foreignkey": { "site": "site_id" }, "actions": ["prevent_update"] },
      { "name": "site_template_type", "type": "varchar", "length": 32, "foreignkey": { "code_site_template_type": "code_val" }, "null": false, "actions": ["prevent_update"] },
      { "name": "site_template_name", "type": "varchar", "length": 256, "null": false },
      { "name": "site_template_title", "type": "varchar", "length": 1024 },
      { "name": "site_template_path", "type": "varchar", "length": -1 },
      { "name": "site_template_config", "type": "varchar", "length": -1 },

      { "name": "site_template_etstmp", "type": "datetime", "length": 7, "default": { "sql": "%%%%%%jsh.map.timestamp%%%%%%" } },
      { "name": "site_template_euser", "type": "varchar", "length": 20, "default": { "sql": "%%%%%%jsh.map.current_user%%%%%%" } },
      { "name": "site_template_mtstmp", "type": "datetime", "length": 7 },
      { "name": "site_template_muser", "type": "varchar", "length": 20 }
    ],
    "unique": [
      ["site_id","site_template_type","site_template_name"]
    ],
    "triggers": [
      { "on": ["update", "insert"], "exec": [
          "set(site_template_mtstmp,%%%%%%jsh.map.timestamp%%%%%%);",
          "set(site_template_muser,%%%%%%jsh.map.current_user%%%%%%);"
        ]
      }
    ]
  },

  "sys_user_session": {
    "type": "table",
    "caption": ["User Session", "User Sessions"],
    "columns": [
      { "name": "sys_user_session_id", "type": "bigint", "key": true, "identity": true, "null": false },
      { "name": "sys_user_id", "type": "bigint", "foreignkey": { "jsharmony.sys_user": { "column": "sys_user_id", "on_delete": "cascade" } }, "null": false, "actions": ["prevent_update"], "unique": true },
      { "name": "site_id", "type": "bigint", "foreignkey": { "site": { "column": "site_id", "on_delete": "null" } } },

      { "name": "sys_user_session_etstmp", "type": "datetime", "length": 7, "default": { "sql": "%%%%%%jsh.map.timestamp%%%%%%" } },
      { "name": "sys_user_session_euser", "type": "varchar", "length": 20, "default": { "sql": "%%%%%%jsh.map.current_user%%%%%%" } },
      { "name": "sys_user_session_mtstmp", "type": "datetime", "length": 7 },
      { "name": "sys_user_session_muser", "type": "varchar", "length": 20 }
    ],
    "index": [
      { "columns": ["sys_user_id", "site_id"] }
    ],
    "triggers": [
      { "on": ["update", "insert"], "exec": [
          "set(sys_user_session_mtstmp,%%%%%%jsh.map.timestamp%%%%%%);",
          "set(sys_user_session_muser,%%%%%%jsh.map.current_user%%%%%%);"
        ]
      }
    ],
    "data_keys": ["sys_user_id"],
    "sample_data": [
      { "sys_user_id": "1", "site_id": "1" }
    ]
  },

  "sys_user_token": {
    "type": "table",
    "caption": ["User Token", "User Tokens"],
    "columns": [
      { "name": "sys_user_token_id", "type": "bigint", "key": true, "identity": true, "null": false },
      { "name": "sys_user_id", "type": "bigint", "foreignkey": { "jsharmony.sys_user": { "column": "sys_user_id", "on_delete": "cascade" } }, "null": false, "actions": ["prevent_update"] },
      { "name": "sys_user_token_hash", "type": "varchar", "length": 256, "null": false, "unique": true },
      { "name": "sys_user_token_ext", "type": "varchar", "length": 32 },
      { "name": "sys_user_token_keys", "type": "varchar", "length": 1024 },

      { "name": "sys_user_token_etstmp", "type": "datetime", "length": 7, "default": { "sql": "%%%%%%jsh.map.timestamp%%%%%%" } },
      { "name": "sys_user_token_euser", "type": "varchar", "length": 20, "default": { "sql": "%%%%%%jsh.map.current_user%%%%%%" } },
      { "name": "sys_user_token_mtstmp", "type": "datetime", "length": 7 },
      { "name": "sys_user_token_muser", "type": "varchar", "length": 20 }
    ],
    "index": [
      { "columns": ["sys_user_token_hash"] }
    ],
    "triggers": [
      { "on": ["update", "insert"], "exec": [
          "set(sys_user_token_mtstmp,%%%%%%jsh.map.timestamp%%%%%%);",
          "set(sys_user_token_muser,%%%%%%jsh.map.current_user%%%%%%);"
        ]
      }
    ]
  },
  
  "sys_user_site": {
    "type": "table",
    "caption": ["User Site", "User Sites"],
    "columns": [
      { "name": "sys_user_site_id", "type": "bigint", "key": true, "identity": true, "null": false },
      { "name": "sys_user_id", "type": "bigint", "foreignkey": { "jsharmony.sys_user": { "column": "sys_user_id", "on_delete": "cascade" } }, "null": false, "actions": ["prevent_update"] },
      { "name": "site_id", "type": "bigint", "foreignkey": { "site": { "column": "site_id", "on_delete": "cascade" } }, "null": false, "actions": ["prevent_update"] },
      { "name": "sys_user_site_editor", "type": "bigint", "foreignkey": { "deployment_target": { "column": "deployment_target_id" } } },
      { "name": "sys_user_site_access", "type": "varchar", "length": 32, "foreignkey": { "code_sys_user_site_access": "code_val" } },
      { "name": "branch_id", "type": "bigint" },

      { "name": "sys_user_site_etstmp", "type": "datetime", "length": 7, "default": { "sql": "%%%%%%jsh.map.timestamp%%%%%%" } },
      { "name": "sys_user_site_euser", "type": "varchar", "length": 20, "default": { "sql": "%%%%%%jsh.map.current_user%%%%%%" } },
      { "name": "sys_user_site_mtstmp", "type": "datetime", "length": 7 },
      { "name": "sys_user_site_muser", "type": "varchar", "length": 20 }
    ],
    "unique": [
      ["sys_user_id", "site_id"]
    ],
    "dependencies": ["{schema}.branch","{schema}.site"],
    "triggers": [
      { "on": ["validate_update", "validate_insert"], "exec": [
          "errorif((inserted(sys_user_site_editor) is not null and inserted(sys_user_site_editor) not in (select deployment_target_id from {schema}.v_my_deployment_target where deployment_target_can_editor = 1 and site_id = inserted(site_id))),'Target Editor not available for this site')",
          "errorif((inserted(sys_user_site_editor) is not null and inserted(sys_user_site_editor) not in (select deployment_target_id from {schema}.v_my_deployment_target where deployment_target_sts='ACTIVE')),'Target Editor is not ACTIVE')",
          "errorif((inserted(branch_id) is not null) and not exists(select branch_id from {schema}.branch where branch_id=inserted(branch_id)),'Branch ID not found');",
        ]
      },
      { "on": ["update", "insert"], "exec": [
          "set(sys_user_site_mtstmp,%%%%%%jsh.map.timestamp%%%%%%);",
          "set(sys_user_site_muser,%%%%%%jsh.map.current_user%%%%%%);"
        ]
      },
      { "on": ["update"], "exec": [
          "update {schema}.sys_user_session set site_id=null where sys_user_id=deleted(sys_user_id) and site_id not in (select site_id from {schema}.v_sys_user_site_access where sys_user_id=deleted(sys_user_id) and sys_user_site_access is not null);",
          "update {schema}.sys_user_site set branch_id=null where branch_id is not null and sys_user_id=deleted(sys_user_id) and site_id not in (select site_id from {schema}.v_sys_user_site_access where sys_user_id=deleted(sys_user_id) and sys_user_site_access is not null);",
        ]
      },
      { "on": ["delete"], "exec": [
          "update {schema}.sys_user_session set site_id=null where sys_user_id=deleted(sys_user_id) and site_id not in (select site_id from {schema}.v_sys_user_site_access where sys_user_id=deleted(sys_user_id) and sys_user_site_access is not null and ((sys_user_site_id is null) or (sys_user_site_id<>deleted(sys_user_site_id))));",
        ]
      }
    ],
    "data_keys": ["sys_user_id"],
    "sample_data": [
      { "sys_user_id": "1", "site_id": "1", "branch_id": "1" }
    ],
  },

  "v_my_site_editor": {
    "type": "view",
    "caption": ["Site", "Sites"],
    "tables": {
      "site": {
        "columns": [
          "site_id",
          "site_name",
          "site_sts"
        ]
      },
      "sys_user_site": {
        "columns": [
          "sys_user_site_editor",
          { "name":"site_editor", "type": "bigint", "sqlselect": "$ifnull($ifnull(sys_user_site.sys_user_site_editor,site_default_editor),(select top1(deployment_target_id from {schema}.v_my_deployment_target dt where deployment_target_can_editor = 1 and dt.deployment_target_sts='ACTIVE' and dt.site_id = site.site_id order by deployment_target_name)))" },
          "branch_id",
        ],
        "join_type": "left",
        "join_columns": {
          "site.site_id": "sys_user_site.site_id",
          "sys_user_site.sys_user_id": "jsharmony.my_sys_user_id()"
        }
      }
    },
    "dependencies": ["{schema}.v_my_deployment_target"]
  },

  "v_my_session": {
    "type": "view",
    "caption": ["Session", "Sessions"],
    "tables": {
      "jsharmony.sys_user": {
        "columns": [
          "sys_user_id"
        ]
      },
      "sys_user_session": {
        "columns": [
          "site_id",
        ],
        "join_type": "left",
        "join_columns": {
          "jsharmony.sys_user.sys_user_id": "sys_user_session.sys_user_id"
        }
      },
    },
    "where": "jsharmony.sys_user.sys_user_id = jsharmony.my_sys_user_id()",
    "triggers": [
      {"on": ["update"], "exec": [
          "errorif(not exists(select site_id from {schema}.v_sys_user_site_access where sys_user_id=jsharmony.my_sys_user_id() and site_id=inserted(site_id)),'User does not have access to target site');",
          "insert into {schema}.sys_user_session(sys_user_id) select jsharmony.my_sys_user_id() where not exists(select * from {schema}.sys_user_session where sys_user_id=jsharmony.my_sys_user_id())",
          "update {schema}.sys_user_session set site_id = inserted(site_id) where sys_user_session.sys_user_id=jsharmony.my_sys_user_id()",
          "increment_changes()"
        ]
      }
    ]
  },

  "v_my_site": {
    "type": "view",
    "caption": ["Site", "Sites"],
    "tables": {
      "v_my_site_editor": {
        "columns": [
          "site_id",
          "site_name",
          "site_sts",
          "sys_user_site_editor",
          "site_editor",
          "branch_id"
        ]
      },
      "v_my_deployment_target": {
        "columns": [
          "deployment_target_id",
          "deployment_target_template_variables"
        ],
        "join_type": "left",
        "join_columns": {
          "v_my_site_editor.site_editor": "v_my_deployment_target.deployment_target_id",
          "deployment_target_can_editor": "1"
        }
      }
    },
    "triggers": [
      {"on": ["update"], "exec": [
          "insert into {schema}.sys_user_site(sys_user_id,site_id) select jsharmony.my_sys_user_id(), inserted(site_id) where not exists(select * from {schema}.sys_user_site where sys_user_id=jsharmony.my_sys_user_id() and site_id=inserted(site_id))",
          "update {schema}.sys_user_site set sys_user_site_editor = inserted(sys_user_site_editor), branch_id = inserted(branch_id) where sys_user_id=jsharmony.my_sys_user_id() and site_id = inserted(site_id)",
          "increment_changes()"
        ]
      }
    ]
  },

  "v_sys_user_site_system_access": {
    "type": "view",
    "caption": ["Site System Access", "Site System Access"],
    "tables": {
      "jsharmony.sys_user_role": {
        "columns": [
          "sys_user_role_id",
          "sys_user_id",
          "sys_role_name",
        ],
      },
    },
    "where":"sys_user_role.sys_role_name in ('WEBMASTER','VIEWER','AUTHOR','PUBLISHER')",
  },

  "v_sys_user_site_access_split": {
    "type": "view",
    "caption": ["Site Access", "Site Access"],
    "tables": {
      "site": {
        "columns": [
          "site_id",
        ],
      },
      "roles": {
        "columns": [
          "role_sys_user_id",
          "role_sys_role_name",
          "role_sys_user_role_id",
        ],
        "sql": "select v_sys_user_site_system_access.sys_user_role_id role_sys_user_role_id, v_sys_user_site_system_access.sys_user_id role_sys_user_id, v_sys_user_site_system_access.sys_role_name role_sys_role_name from {schema}.v_sys_user_site_system_access union select null role_sys_user_role_id, null role_sys_user_id, null role_sys_role_name",
        "join_type": "left",
      },
      "sys_user_site": {
        "columns": [
          "sys_user_site_id",
          "sys_user_id",
          "sys_user_site_access",
        ],
        "join_type": "left",
        "join_columns": {
          "sys_user_site.site_id": "site.site_id",
          "roles.role_sys_user_id": "null",
        }
      },
    },
    "dependencies": ["{schema}.v_sys_user_site_system_access"]
  },

  "v_my_session_role": {
    "type": "view",
    "caption": ["Session Role", "Session Roles"],
    "tables": {
      "roles": {
        "columns": [
          "sys_role_name",
        ],
        "sql": [
          "select sys_role_name from jsharmony.sys_user_role where sys_user_id=jsharmony.my_sys_user_id()",
          "union",
          "select sys_user_site_access",
          "  from {schema}.sys_user_session",
          "    inner join {schema}.sys_user_site on sys_user_site.sys_user_id=sys_user_session.sys_user_id and sys_user_site.site_id=sys_user_session.site_id",
          "  where sys_user_session.sys_user_id=jsharmony.my_sys_user_id()"
        ],
      },
    }
  },

  "v_sys_user_site_access": {
    "type": "view",
    "caption": ["Site Access", "Site Access"],
    "tables": {
      "v_sys_user_site_access_split": {
        "columns": [
          "sys_user_site_id",
          { "name": "sys_user_role_id", "type": "bigint", "sqlselect": "role_sys_user_role_id"},
          "site_id",
          { "name":"sys_user_id", "type": "bigint", "sqlselect": "case when role_sys_user_id is not null then role_sys_user_id else sys_user_id end" },
          { "name":"sys_user_site_access", "type": "varchar", "length": 32, "sqlselect": "$ifnull(role_sys_role_name, sys_user_site_access)" },
          { "name":"sys_user_site_system_access", "type": "int", "sqlselect": "(case when role_sys_user_id is not null then 1 else 0 end)" },
        ],
      },
    },
    "where": "(role_sys_user_id is not null or sys_user_id is not null) and (sys_user_site_access is not null or role_sys_role_name is not null)",
    "triggers": [
      { "on": ["insert"], "exec": [
          [
            "errorif(exists(select sys_user_site_id from {schema}.sys_user_site where sys_user_id=inserted(sys_user_id) and site_id=inserted(site_id) and sys_user_site_access is not null),'User is already added to this site');",
            "errorif(inserted(sys_user_site_access) is null,'Cannot add null permission');",
            "insert into {schema}.sys_user_site(sys_user_id,site_id) select inserted(sys_user_id), inserted(site_id) where not exists(select * from {schema}.sys_user_site where sys_user_id=inserted(sys_user_id) and site_id=inserted(site_id));",
            "update {schema}.sys_user_site set sys_user_site_access = inserted(sys_user_site_access) where sys_user_id=inserted(sys_user_id) and site_id = inserted(site_id);",
            "return_insert_key(sys_user_site, sys_user_site_id, (sys_user_id=inserted(sys_user_id) and site_id=inserted(site_id)));",
            "increment_changes()",
          ]
        ]
      },
      { "on": ["update"], "exec": [
          [
            "errorif(update(sys_user_id),'Cannot update sys_user_id');",
            "update sys_user_site set sys_user_site_access=inserted(sys_user_site_access) where site_id=deleted(site_id) and sys_user_id=deleted(sys_user_id);",
            "increment_changes()",
          ]
        ]
      },
      { "on": ["delete"], "exec": [
          "update sys_user_site set sys_user_site_access = null where site_id=deleted(site_id) and sys_user_id=deleted(sys_user_id);",
          "increment_changes()"
        ]
      }
    ]
  }
}