CREATE DATABASE nacos;
\c nacos;
CREATE TABLE config_info (
    id SERIAL PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) DEFAULT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user text,
    src_ip varchar(50) DEFAULT NULL,
    app_name varchar(128) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    c_desc varchar(256) DEFAULT NULL,
    c_use varchar(64) DEFAULT NULL,
    effect varchar(64) DEFAULT NULL,
    type varchar(64) DEFAULT NULL,
    c_schema text,
    encrypted_data_key varchar(1024) DEFAULT ''
);

COMMENT ON TABLE config_info IS 'config_info';
COMMENT ON COLUMN config_info.id IS 'id';
COMMENT ON COLUMN config_info.data_id IS 'data_id';
COMMENT ON COLUMN config_info.content IS 'content';
COMMENT ON COLUMN config_info.md5 IS 'md5';
COMMENT ON COLUMN config_info.gmt_create IS '创建时间';
COMMENT ON COLUMN config_info.gmt_modified IS '修改时间';
COMMENT ON COLUMN config_info.src_user IS 'source user';
COMMENT ON COLUMN config_info.src_ip IS 'source ip';
COMMENT ON COLUMN config_info.tenant_id IS '租户字段';
COMMENT ON COLUMN config_info.encrypted_data_key IS '密钥';

CREATE UNIQUE INDEX IF NOT EXISTS uk_configinfo_datagrouptenant ON config_info (data_id, group_id, tenant_id);

CREATE TABLE config_info_gray (
    id SERIAL PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    src_user text,
    src_ip varchar(100) DEFAULT NULL,
    gmt_create timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    app_name varchar(128) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    gray_name varchar(128) NOT NULL,
    gray_rule text NOT NULL,
    encrypted_data_key varchar(256) DEFAULT ''
);

COMMENT ON TABLE config_info_gray IS 'config_info_gray';

CREATE UNIQUE INDEX IF NOT EXISTS uk_configinfogray_datagrouptenantgray ON config_info_gray (data_id, group_id, tenant_id, gray_name);
CREATE INDEX IF NOT EXISTS idx_dataid_gmt_modified ON config_info_gray (data_id, gmt_modified);
CREATE INDEX IF NOT EXISTS idx_gmt_modified ON config_info_gray (gmt_modified);

CREATE TABLE config_info_beta (
    id SERIAL PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    content text NOT NULL,
    beta_ips varchar(1024) DEFAULT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user text,
    src_ip varchar(50) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    encrypted_data_key varchar(1024) DEFAULT ''
);

COMMENT ON TABLE config_info_beta IS 'config_info_beta';

CREATE UNIQUE INDEX IF NOT EXISTS uk_configinfobeta_datagrouptenant ON config_info_beta (data_id, group_id, tenant_id);

CREATE TABLE config_info_tag (
    id SERIAL PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    tenant_id varchar(128) DEFAULT '',
    tag_id varchar(128) NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user text,
    src_ip varchar(50) DEFAULT NULL
);

COMMENT ON TABLE config_info_tag IS 'config_info_tag';

CREATE UNIQUE INDEX IF NOT EXISTS uk_configinfotag_datagrouptenanttag ON config_info_tag (data_id, group_id, tenant_id, tag_id);

CREATE TABLE config_tags_relation (
    id bigint NOT NULL,
    tag_name varchar(128) NOT NULL,
    tag_type varchar(64) DEFAULT NULL,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    tenant_id varchar(128) DEFAULT '',
    nid SERIAL PRIMARY KEY
);

COMMENT ON TABLE config_tags_relation IS 'config_tag_relation';

CREATE UNIQUE INDEX IF NOT EXISTS uk_configtagrelation_configidtag ON config_tags_relation (id, tag_name, tag_type);
CREATE INDEX IF NOT EXISTS idx_tenant_id ON config_tags_relation (tenant_id);

CREATE TABLE group_capacity (
    id SERIAL PRIMARY KEY,
    group_id varchar(128) NOT NULL DEFAULT '',
    quota int NOT NULL DEFAULT '0',
    usage int NOT NULL DEFAULT '0',
    max_size int NOT NULL DEFAULT '0',
    max_aggr_count int NOT NULL DEFAULT '0',
    max_aggr_size int NOT NULL DEFAULT '0',
    max_history_count int NOT NULL DEFAULT '0',
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

COMMENT ON TABLE group_capacity IS '集群、各Group容量信息表';
COMMENT ON COLUMN group_capacity.id IS '主键ID';
COMMENT ON COLUMN group_capacity.group_id IS 'Group ID，空字符表示整个集群';
COMMENT ON COLUMN group_capacity.quota IS '配额，0表示使用默认值';
COMMENT ON COLUMN group_capacity.usage IS '使用量';
COMMENT ON COLUMN group_capacity.max_size IS '单个配置大小上限，单位为字节，0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_aggr_count IS '聚合子配置最大个数，，0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_aggr_size IS '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值';
COMMENT ON COLUMN group_capacity.max_history_count IS '最大变更历史数量';

CREATE UNIQUE INDEX IF NOT EXISTS uk_group_id ON group_capacity (group_id);

CREATE TABLE his_config_info (
    id bigint NOT NULL,
    nid SERIAL PRIMARY KEY,
    data_id varchar(255) NOT NULL,
    group_id varchar(128) NOT NULL,
    app_name varchar(128) DEFAULT NULL,
    content text NOT NULL,
    md5 varchar(32) DEFAULT NULL,
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    src_user text,
    src_ip varchar(50) DEFAULT NULL,
    op_type char(10) DEFAULT NULL,
    tenant_id varchar(128) DEFAULT '',
    encrypted_data_key varchar(1024) DEFAULT '',
    publish_type varchar(50) DEFAULT 'formal',
    gray_name varchar(50) DEFAULT NULL,
    ext_info text DEFAULT NULL
);

COMMENT ON TABLE his_config_info IS '多租户改造';

CREATE INDEX IF NOT EXISTS idx_gmt_create ON his_config_info (gmt_create);
CREATE INDEX IF NOT EXISTS idx_gmt_modified ON his_config_info (gmt_modified);
CREATE INDEX IF NOT EXISTS idx_did ON his_config_info (data_id);

CREATE TABLE tenant_capacity (
    id SERIAL PRIMARY KEY,
    tenant_id varchar(128) NOT NULL DEFAULT '',
    quota int NOT NULL DEFAULT '0',
    usage int NOT NULL DEFAULT '0',
    max_size int NOT NULL DEFAULT '0',
    max_aggr_count int NOT NULL DEFAULT '0',
    max_aggr_size int NOT NULL DEFAULT '0',
    max_history_count int NOT NULL DEFAULT '0',
    gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);

COMMENT ON TABLE tenant_capacity IS '租户容量信息表';
COMMENT ON COLUMN tenant_capacity.id IS '主键ID';
COMMENT ON COLUMN tenant_capacity.tenant_id IS 'Tenant ID';
COMMENT ON COLUMN tenant_capacity.quota IS '配额，0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.usage IS '使用量';
COMMENT ON COLUMN tenant_capacity.max_size IS '单个配置大小上限，单位为字节，0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.max_aggr_count IS '聚合子配置最大个数';
COMMENT ON COLUMN tenant_capacity.max_aggr_size IS '单个聚合数据的子配置大小上限，单位为字节，0表示使用默认值';
COMMENT ON COLUMN tenant_capacity.max_history_count IS '最大变更历史数量';

CREATE UNIQUE INDEX IF NOT EXISTS uk_tenant_id ON tenant_capacity (tenant_id);

CREATE TABLE tenant_info (
    id SERIAL PRIMARY KEY,
    kp varchar(128) NOT NULL,
    tenant_id varchar(128) DEFAULT '',
    tenant_name varchar(128) DEFAULT '',
    tenant_desc varchar(256) DEFAULT NULL,
    create_source varchar(32) DEFAULT NULL,
    gmt_create bigint NOT NULL,
    gmt_modified bigint NOT NULL
);

COMMENT ON TABLE tenant_info IS 'tenant_info';

CREATE UNIQUE INDEX IF NOT EXISTS uk_tenant_info_kptenantid ON tenant_info (kp, tenant_id);
CREATE INDEX IF NOT EXISTS idx_tenant_id ON tenant_info (tenant_id);

CREATE TABLE users (
    username varchar(50) PRIMARY KEY,
    password varchar(500) NOT NULL,
    enabled boolean NOT NULL
);

COMMENT ON TABLE users IS 'users';
COMMENT ON COLUMN users.username IS 'username';
COMMENT ON COLUMN users.password IS 'password';
COMMENT ON COLUMN users.enabled IS 'enabled';

CREATE TABLE roles (
    username varchar(50) NOT NULL,
    role varchar(50) NOT NULL
);

COMMENT ON TABLE roles IS 'roles';
COMMENT ON COLUMN roles.username IS 'username';
COMMENT ON COLUMN roles.role IS 'role';

CREATE UNIQUE INDEX IF NOT EXISTS idx_user_role ON roles (username, role);

CREATE TABLE permissions (
    role varchar(50) NOT NULL,
    resource varchar(128) NOT NULL,
    action varchar(8) NOT NULL
);

COMMENT ON TABLE permissions IS 'permissions';
COMMENT ON COLUMN permissions.role IS 'role';
COMMENT ON COLUMN permissions.resource IS 'resource';
COMMENT ON COLUMN permissions.action IS 'action';

CREATE UNIQUE INDEX IF NOT EXISTS uk_role_permission ON permissions (role, resource, action);

-- 创建 nacos默认用户 nacos 密码 nacospwd
INSERT INTO users (username, password, enabled)
VALUES ('nacos', '$2a$10$isjtanRWoaXwHA0Z0LLl2.PHvRAcHdqpQeGZsAygg/rIyMNGSfhsG', true);
INSERT INTO roles (username, role)
VALUES ('nacos', 'ROLE_ADMIN');
