feat(backoffice): migrate remaining menus to Smilegate tables

This commit is contained in:
devmrko
2026-07-22 14:18:54 +09:00
parent 404244534a
commit 1538aadb14
4 changed files with 46 additions and 25 deletions

View File

@@ -156,6 +156,26 @@ begin
updated_at timestamp default systimestamp not null, updated_at timestamp default systimestamp not null,
constraint sg_masking_rule_enabled_ck check (enabled_yn in (''Y'', ''N'')) constraint sg_masking_rule_enabled_ck check (enabled_yn in (''Y'', ''N''))
)'); )');
create_if_missing('create table sg_access_bearer_token (
key_id number primary key, user_id number not null, key_prefix varchar2(100) not null,
key_hash varchar2(256) not null unique, expires_at timestamp not null, revoked_at timestamp,
description varchar2(500), created_at timestamp default systimestamp not null,
constraint sg_access_bearer_token_user_fk foreign key (user_id) references sg_app_user(user_id)
)');
create_if_missing('create table sg_backoffice_setting (
setting_key varchar2(200) primary key, setting_value varchar2(4000),
updated_at timestamp default systimestamp not null
)');
create_if_missing('create table sg_vector_document_chunk (
chunk_id number primary key, document_id varchar2(200) not null, chunk_no number not null,
content clob not null, embedding vector(1536, float32), created_at timestamp default systimestamp not null
)');
create_if_missing('create table sg_vector_document_tag (
chunk_id number not null, tech_tag varchar2(200) not null,
constraint sg_vector_document_tag_pk primary key (chunk_id, tech_tag),
constraint sg_vector_document_tag_chunk_fk foreign key (chunk_id) references sg_vector_document_chunk(chunk_id)
)');
create_if_missing('create sequence sg_vector_chunk_seq start with 1 increment by 1 nocache');
create_if_missing('create table sg_column_masking_rule ( create_if_missing('create table sg_column_masking_rule (
column_id number primary key, column_id number primary key,
rule_id number not null, rule_id number not null,
@@ -244,6 +264,10 @@ create or replace view cb_column_masking_rule as
select column_id, rule_id, updated_at from sg_column_masking_rule; select column_id, rule_id, updated_at from sg_column_masking_rule;
create or replace view cb_user_masking_rule as create or replace view cb_user_masking_rule as
select user_id, column_id, decision, active_yn, updated_at from sg_user_masking_rule; select user_id, column_id, decision, active_yn, updated_at from sg_user_masking_rule;
create or replace view cb_ords_probe_audit as
select audit_id, event_type, key_id, object_id, status, row_count, error_code, message, created_at from sg_audit_event;
create or replace view cb_backoffice_setting as
select setting_key, setting_value, updated_at from sg_backoffice_setting;
-- PoC administrator access: both demo operators can manage and query every -- PoC administrator access: both demo operators can manage and query every
-- Smilegate game-data object registered in SGMP_POC. -- Smilegate game-data object registered in SGMP_POC.

View File

@@ -56,9 +56,9 @@ public class VectorKnowledgeService {
} }
public VectorKnowledgeSummary summary() { public VectorKnowledgeSummary summary() {
int documents = count("SELECT COUNT(DISTINCT document_id) FROM cb_vector_document_chunk"); int documents = count("SELECT COUNT(DISTINCT document_id) FROM sg_vector_document_chunk");
int chunks = count("SELECT COUNT(*) FROM cb_vector_document_chunk"); int chunks = count("SELECT COUNT(*) FROM sg_vector_document_chunk");
int tags = count("SELECT COUNT(*) FROM cb_vector_document_tag"); int tags = count("SELECT COUNT(*) FROM sg_vector_document_tag");
boolean registered = protectedObjectService.findEnabled().stream() boolean registered = protectedObjectService.findEnabled().stream()
.anyMatch(object -> VECTOR_OBJECT.equalsIgnoreCase(object.objectName())); .anyMatch(object -> VECTOR_OBJECT.equalsIgnoreCase(object.objectName()));
return new VectorKnowledgeSummary( return new VectorKnowledgeSummary(
@@ -107,13 +107,13 @@ public class VectorKnowledgeService {
String embeddingJson = json(embedding); String embeddingJson = json(embedding);
long chunkId = nextChunkId++; long chunkId = nextChunkId++;
jdbcTemplate.update(""" jdbcTemplate.update("""
INSERT INTO cb_vector_document_chunk INSERT INTO sg_vector_document_chunk
(chunk_id, document_id, chunk_no, title, chunk_text, source_uri, embedding) (chunk_id, document_id, chunk_no, title, chunk_text, source_uri, embedding)
VALUES (?, ?, ?, ?, ?, ?, TO_VECTOR(?)) VALUES (?, ?, ?, ?, ?, ?, TO_VECTOR(?))
""", chunkId, documentId, chunk.chunkNo(), title, chunk.text(), sourceUri, embeddingJson); """, chunkId, documentId, chunk.chunkNo(), title, chunk.text(), sourceUri, embeddingJson);
for (String tag : tags) { for (String tag : tags) {
jdbcTemplate.update(""" jdbcTemplate.update("""
INSERT INTO cb_vector_document_tag (chunk_id, tech_tag) INSERT INTO sg_vector_document_tag (chunk_id, tech_tag)
VALUES (?, ?) VALUES (?, ?)
""", chunkId, tag); """, chunkId, tag);
tagCount++; tagCount++;
@@ -143,18 +143,18 @@ public class VectorKnowledgeService {
private void replaceDocument(String documentId) { private void replaceDocument(String documentId) {
jdbcTemplate.update(""" jdbcTemplate.update("""
DELETE FROM cb_vector_document_tag DELETE FROM sg_vector_document_tag
WHERE chunk_id IN ( WHERE chunk_id IN (
SELECT chunk_id FROM cb_vector_document_chunk WHERE document_id = ? SELECT chunk_id FROM sg_vector_document_chunk WHERE document_id = ?
) )
""", documentId); """, documentId);
jdbcTemplate.update("DELETE FROM cb_vector_document_chunk WHERE document_id = ?", documentId); jdbcTemplate.update("DELETE FROM sg_vector_document_chunk WHERE document_id = ?", documentId);
} }
private long nextChunkId(int chunkCount) { private long nextChunkId(int chunkCount) {
try { try {
Long sequenceValue = jdbcTemplate.queryForObject( Long sequenceValue = jdbcTemplate.queryForObject(
"SELECT cb_vector_chunk_seq.NEXTVAL FROM dual", Long.class); "SELECT sg_vector_chunk_seq.NEXTVAL FROM dual", Long.class);
if (sequenceValue != null) { if (sequenceValue != null) {
return sequenceValue; return sequenceValue;
} }
@@ -163,7 +163,7 @@ public class VectorKnowledgeService {
// fallback keeps the demonstration usable; the setup SQL creates it. // fallback keeps the demonstration usable; the setup SQL creates it.
} }
Long max = jdbcTemplate.queryForObject( Long max = jdbcTemplate.queryForObject(
"SELECT NVL(MAX(chunk_id), 28000) FROM cb_vector_document_chunk", Long.class); "SELECT NVL(MAX(chunk_id), 28000) FROM sg_vector_document_chunk", Long.class);
return (max == null ? 28000 : max) + 1; return (max == null ? 28000 : max) + 1;
} }

View File

@@ -3,47 +3,44 @@
"https://mybatis.org/dtd/mybatis-3-mapper.dtd"> "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cloudhandson.vpdbackoffice.mapper.BearerTokenMapper"> <mapper namespace="com.cloudhandson.vpdbackoffice.mapper.BearerTokenMapper">
<select id="findAll" resultType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord"> <select id="findAll" resultType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord">
SELECT k.key_id, k.employee_id AS user_id, u.full_name AS username, SELECT k.key_id, k.user_id, u.user_name AS username,
CAST(NULL AS VARCHAR2(100)) AS stakeholder_user_id, CAST(NULL AS VARCHAR2(100)) AS stakeholder_user_id,
CAST(NULL AS VARCHAR2(100)) AS stakeholder_role, CAST(NULL AS VARCHAR2(100)) AS stakeholder_channel, CAST(NULL AS VARCHAR2(100)) AS stakeholder_role, CAST(NULL AS VARCHAR2(100)) AS stakeholder_channel,
k.key_prefix, k.key_hash, k.key_prefix, k.key_hash,
k.expires_at, k.revoked_at, k.description k.expires_at, k.revoked_at, k.description
FROM hmm_access_bearer_tokens k FROM sg_access_bearer_token k JOIN sg_app_user u ON u.user_id = k.user_id
JOIN hmm_hr_employees u ON u.employee_id = k.employee_id
WHERE #{includeInactive} = 1 WHERE #{includeInactive} = 1
OR (k.revoked_at IS NULL AND k.expires_at > SYSTIMESTAMP) OR (k.revoked_at IS NULL AND k.expires_at > SYSTIMESTAMP)
ORDER BY k.key_id DESC ORDER BY k.key_id DESC
</select> </select>
<select id="findById" resultType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord"> <select id="findById" resultType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord">
SELECT k.key_id, k.employee_id AS user_id, u.full_name AS username, SELECT k.key_id, k.user_id, u.user_name AS username,
CAST(NULL AS VARCHAR2(100)) AS stakeholder_user_id, CAST(NULL AS VARCHAR2(100)) AS stakeholder_user_id,
CAST(NULL AS VARCHAR2(100)) AS stakeholder_role, CAST(NULL AS VARCHAR2(100)) AS stakeholder_channel, CAST(NULL AS VARCHAR2(100)) AS stakeholder_role, CAST(NULL AS VARCHAR2(100)) AS stakeholder_channel,
k.key_prefix, k.key_hash, k.key_prefix, k.key_hash,
k.expires_at, k.revoked_at, k.description k.expires_at, k.revoked_at, k.description
FROM hmm_access_bearer_tokens k FROM sg_access_bearer_token k JOIN sg_app_user u ON u.user_id = k.user_id
JOIN hmm_hr_employees u ON u.employee_id = k.employee_id
WHERE k.key_id = #{keyId} WHERE k.key_id = #{keyId}
</select> </select>
<select id="findByHash" resultType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord"> <select id="findByHash" resultType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord">
SELECT k.key_id, k.employee_id AS user_id, u.full_name AS username, SELECT k.key_id, k.user_id, u.user_name AS username,
CAST(NULL AS VARCHAR2(100)) AS stakeholder_user_id, CAST(NULL AS VARCHAR2(100)) AS stakeholder_user_id,
CAST(NULL AS VARCHAR2(100)) AS stakeholder_role, CAST(NULL AS VARCHAR2(100)) AS stakeholder_channel, CAST(NULL AS VARCHAR2(100)) AS stakeholder_role, CAST(NULL AS VARCHAR2(100)) AS stakeholder_channel,
k.key_prefix, k.key_hash, k.key_prefix, k.key_hash,
k.expires_at, k.revoked_at, k.description k.expires_at, k.revoked_at, k.description
FROM hmm_access_bearer_tokens k FROM sg_access_bearer_token k JOIN sg_app_user u ON u.user_id = k.user_id
JOIN hmm_hr_employees u ON u.employee_id = k.employee_id
WHERE k.key_hash = #{keyHash,jdbcType=VARCHAR} WHERE k.key_hash = #{keyHash,jdbcType=VARCHAR}
</select> </select>
<select id="nextKeyId" resultType="long"> <select id="nextKeyId" resultType="long">
SELECT NVL(MAX(key_id), 0) + 1 FROM hmm_access_bearer_tokens SELECT NVL(MAX(key_id), 0) + 1 FROM sg_access_bearer_token
</select> </select>
<insert id="insertToken" parameterType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord"> <insert id="insertToken" parameterType="com.cloudhandson.vpdbackoffice.domain.token.BearerTokenRecord">
INSERT INTO hmm_access_bearer_tokens ( INSERT INTO sg_access_bearer_token (
key_id, employee_id, key_prefix, key_hash, expires_at, revoked_at, description key_id, user_id, key_prefix, key_hash, expires_at, revoked_at, description
) VALUES ( ) VALUES (
#{keyId,jdbcType=NUMERIC}, #{keyId,jdbcType=NUMERIC},
#{userId,jdbcType=NUMERIC}, #{userId,jdbcType=NUMERIC},
@@ -56,7 +53,7 @@
</insert> </insert>
<update id="revokeToken"> <update id="revokeToken">
UPDATE hmm_access_bearer_tokens UPDATE sg_access_bearer_token
SET revoked_at = #{revokedAt,jdbcType=TIMESTAMP}, SET revoked_at = #{revokedAt,jdbcType=TIMESTAMP},
description = CASE description = CASE
WHEN #{reason,jdbcType=VARCHAR} IS NULL THEN description WHEN #{reason,jdbcType=VARCHAR} IS NULL THEN description

View File

@@ -4,12 +4,12 @@
<mapper namespace="com.cloudhandson.vpdbackoffice.mapper.SettingMapper"> <mapper namespace="com.cloudhandson.vpdbackoffice.mapper.SettingMapper">
<select id="findByKey" resultType="com.cloudhandson.vpdbackoffice.domain.setting.BackofficeSetting"> <select id="findByKey" resultType="com.cloudhandson.vpdbackoffice.domain.setting.BackofficeSetting">
SELECT setting_key, setting_value SELECT setting_key, setting_value
FROM cb_backoffice_setting FROM sg_backoffice_setting
WHERE setting_key = #{settingKey,jdbcType=VARCHAR} WHERE setting_key = #{settingKey,jdbcType=VARCHAR}
</select> </select>
<update id="upsert"> <update id="upsert">
MERGE INTO cb_backoffice_setting dst MERGE INTO sg_backoffice_setting dst
USING ( USING (
SELECT #{settingKey,jdbcType=VARCHAR} setting_key, SELECT #{settingKey,jdbcType=VARCHAR} setting_key,
#{settingValue,jdbcType=VARCHAR} setting_value #{settingValue,jdbcType=VARCHAR} setting_value