Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[重写] 去 SaaS 层方案 #626

Closed
wklken opened this issue Aug 22, 2022 · 8 comments
Closed

[重写] 去 SaaS 层方案 #626

wklken opened this issue Aug 22, 2022 · 8 comments
Assignees
Labels
backlog 需求初始状态,等待产品进行评估 Layer: api Api module related Layer: saas SaaS module related Priority: High
Milestone

Comments

@wklken
Copy link
Collaborator

wklken commented Aug 22, 2022

过渡期: 保留bk-user saas, 但是所有接口call_through到后台

  1. 去掉SDK所有代码
  2. 去掉大部分header头
  3. 报错日志/可观测性需要有所增强
  4. 新写 API, 不依赖原先任何逻辑(proxy model+custom manager+独立viewset等)

#613

PR: #644

@wklken wklken added Layer: api Api module related Layer: saas SaaS module related Priority: High backlog 需求初始状态,等待产品进行评估 labels Aug 22, 2022
@wklken wklken added this to the Y2022M34 milestone Aug 22, 2022
@wklken
Copy link
Collaborator Author

wklken commented Aug 25, 2022

前端调用后台的所有接口

src/pages/src/api/index.js:60:    return http.queue.cancel(requestId);
src/pages/src/store/index.js:68:      return http.get('api/v2/me/');
src/pages/src/store/index.js:71:      return http.get('api/v2/version_logs_list/');
src/pages/src/store/index.js:74:      return http.get('api/footer/');
src/pages/src/store/modules/password.js:22:      return http.get(`api/v1/password/check_token/?token=${params}`);
src/pages/src/store/modules/password.js:26:      return http.post('api/v1/password/reset_by_token/', params);
src/pages/src/store/modules/password.js:30:      return http.post('api/v1/password/modify/', params);
src/pages/src/store/modules/password.js:34:      return http.post('api/v1/password/reset/', params);
src/pages/src/store/modules/catalog.js:51:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:57:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:63:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:69:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:75:      return http.post(`api/v2/categories/${params.id}/sync/`);
src/pages/src/store/modules/catalog.js:81:      return http.post(`api/v2/categories/${params.id}/sync/`, params.data);
src/pages/src/store/modules/catalog.js:89:      return http.post(url, {
src/pages/src/store/modules/catalog.js:97:      return http.delete(url, config);
src/pages/src/store/modules/catalog.js:103:      return http.patch(url, params.data, config);
src/pages/src/store/modules/catalog.js:108:      return http.patch(url, params.data, config);
src/pages/src/store/modules/catalog.js:113:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:121:      return http.put(url, params.data, config);
src/pages/src/store/modules/catalog.js:126:      return http.put(url, params.data, config);
src/pages/src/store/modules/catalog.js:131:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:136:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:143:      return http.post(url, params.data, config);
src/pages/src/store/modules/catalog.js:148:      return http.put(url, params.data, config);
src/pages/src/store/modules/catalog.js:153:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:158:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:168:      return http.post(url, obj, config);
src/pages/src/store/modules/catalog.js:175:      return http.post(url, params.data, config);
src/pages/src/store/modules/catalog.js:180:      return http.put(url, params.data, config);
src/pages/src/store/modules/catalog.js:185:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:190:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:200:      return http.post(url, obj, config);
src/pages/src/store/modules/catalog.js:207:      return http.get(url, config);
src/pages/src/store/modules/catalog.js:211:      return http.put(url, params.data, config);
src/pages/src/store/modules/organization.js:33:      return http.get(`api/v2/departments/?only_enabled=${onlyEnabled}`);
src/pages/src/store/modules/organization.js:40:      return http.get(`api/v2/departments/${params.id}/`);
src/pages/src/store/modules/organization.js:46:        return http.get(`api/v2/categories/${id}/departments/search/?keyword=${keyword}&max_items=${searchLength}&with_ancestors=true`);
src/pages/src/store/modules/organization.js:48:      return http.get(`api/v2/categories/${id}/departments/search/?keyword=${keyword}&max_items=${searchLength}`);
src/pages/src/store/modules/organization.js:52:      return http.post('api/v2/departments/', params);
src/pages/src/store/modules/organization.js:56:      return http.delete(`api/v2/departments/${params.id}/`);
src/pages/src/store/modules/organization.js:61:      return http.patch(`api/v2/departments/${id}/`, { name });
src/pages/src/store/modules/organization.js:65:      return http.patch(`api/v2/${params.nodeType}/${params.id}/switch_order/${params.upId}/`);
src/pages/src/store/modules/organization.js:70:      return http.post(`api/v2/departments/${id}/profiles/`, { profile_id_list: idList });
src/pages/src/store/modules/organization.js:75:      return http.get(`api/v2/search/detail/?keyword=${params.searchKey}&max_items=${params.searchLength}&only_enabled=true`);
src/pages/src/store/modules/organization.js:87:      return http.post('api/v2/profiles/', params);
src/pages/src/store/modules/organization.js:92:      return http.delete('api/v2/batch/profiles/', config);
src/pages/src/store/modules/organization.js:97:      return http.patch(`api/v2/profiles/${id}/`, data);
src/pages/src/store/modules/organization.js:101:      return http.patch('api/v2/batch/profiles/', params);
src/pages/src/store/modules/organization.js:105:      return http.get(`api/v2/categories/${params.id}/profiles/?no_page=true`);
src/pages/src/store/modules/organization.js:110:      return http.get(`api/v2/categories/${id}/profiles/?keyword=${keyword}&page=${page}&page_size=${pageSize}`);
src/pages/src/store/modules/organization.js:114:      return http.get(`api/v2/profiles/${params.id}/`);
src/pages/src/store/modules/organization.js:119:      return http.post(`/api/v2/profiles/${id}/restoration/`);
src/pages/src/store/modules/organization.js:123:      return http.get(`api/v3/profiles/?${params}`);
src/pages/src/store/modules/organization.js:127:      return http.get(`api/v3/departments/?${params}`);
src/pages/src/store/modules/setting.js:21:      return http.get('api/v2/fields/manageable/');
src/pages/src/store/modules/setting.js:24:      return http.post('api/v2/fields/', params.data);
src/pages/src/store/modules/setting.js:27:      return http.delete(`api/v2/fields/${params.id}/`);
src/pages/src/store/modules/setting.js:30:      return http.patch(`api/v2/fields/${params.id}/`, params.data);
src/pages/src/store/modules/setting.js:34:      return http.get('api/v2/fields/');
src/pages/src/store/modules/setting.js:39:      return http.patch(`api/v2/fields/${id}/order/${index}/`);
src/pages/src/store/modules/setting.js:43:      return http.patch('api/v2/fields/visible/', {
src/pages/src/store/modules/audit.js:27:      return http.get(`api/v2/audit/login_log/?start_time=${startTime}&end_time=${endTime}&page=${page}&page_size=${pageSize}`);
src/pages/src/store/modules/audit.js:38:      return http.get(`api/v2/audit/operation_logs/?start_time=${startTime}&end_time=${endTime}&page=${page}&page_size=${pageSize}${keyword && (`&keyword=${keyword}`)}`);
src/pages/src/store/modules/audit.js:44:      return http.get(`${url}/api/v2/audit/login_log/export/?start_time=${startTime}&end_time=${endTime}`);

@wklken
Copy link
Collaborator Author

wklken commented Aug 25, 2022

考虑第一期的处理:

  1. 将 saas的逻辑挪到api层 (saas 直接将请求代理到api, 需要考虑登录态如何处理)
  2. api 层saas viewset逻辑, 直接访问 db,
  3. 权限控制在 saas api处理(需小规模调整)

好处:

  1. 解耦 saas api/open api
  2. 去掉 saas 主体逻辑/去掉saas sdk/去掉 saas 权限处理等
  3. 未来可以直接去掉saas

问题:

  1. 登录态如何处理
  2. 怎么做透传

@wklken
Copy link
Collaborator Author

wklken commented Aug 25, 2022

saas 的version_log封装去掉, 直接以md的文件展示处理; (性能问题 / 封装报错无法调试)

@wklken
Copy link
Collaborator Author

wklken commented Aug 25, 2022

第一阶段: 保证功能一致, 前端 URL 一致, 先去掉headers和 SDK

  1. 前端/登录态/SaaS 原有的表暂时不动
  2. saas的slz挪到后台
  3. saas没有slz, 请求直接转成api的 URL /api/v1/web/profiles/xxxxx; 有统一的映射
  4. 后台处理web侧的逻辑, 统一放在某个目录下(xxAPI), 需要处理: bkiam逻辑/审计相关的逻辑;(暂时不用处理登录态)
  5. 全部挪完之后, 可以去掉
    • SaaS 所有的view逻辑
    • SaaS 所有权限相关的逻辑
    • sdk
    • headers
    • 原先api中关于这批header的特殊处理逻辑 API_FORCE_RAW_RESP_HEADER_NAME/API_FORCE_RAW_USERNAME_HEADER_NAME

  1. 可以去掉SaaS的复杂度
  2. 可以去掉api中针对saas 接口的封装/特殊处理, 使原来接口更纯粹; 逻辑更简单/bug更少/问题更好排查

@wklken
Copy link
Collaborator Author

wklken commented Aug 26, 2022

问题: 二进制版, 没有api/auth的情况下, saas api怎么处理

@wklken wklken modified the milestones: Y2022M34, Y2022M35, Y2022M36 Aug 29, 2022
@wklken
Copy link
Collaborator Author

wklken commented Sep 8, 2022

#644

@wklken wklken modified the milestones: Y2022M36, Y2022M37 Sep 13, 2022
@wklken
Copy link
Collaborator Author

wklken commented Sep 13, 2022

前端需要修正的

  1. 所有URL映射更新成新的
  2. /api/v2/categories/1/profiles/?keyword=&page=1&page_size=10读取的 response.data.data; 应该改成 response.data.results (其他接口都是results, 为什么这个接口用的data?)
  3. /api/v2/categories/13/departments/search/?keyword=a&max_items=40&with_ancestors=true 这里max_items改成page_size
  4. /api/v2/search/detail/?keyword=1&max_items=40&only_enabled=true 去掉only_enabled=true(老的代码就不支持这个参数) => 结果按需返回, 而不是返回所有结构体+空的items, 所以前端需要先判断是否存在/或者遍历
  5. 遗留bug: 搜索报错 前端: 搜索接口, 当department存在数据时, 会报错 #676

@wklken
Copy link
Collaborator Author

wklken commented Sep 14, 2022

  1. open api解耦能删除哪些接口? 能删除哪些代码?
  2. 需要测试单独申请某几个部门权限的场景: 搜索是否有权限
  3. check 所有软删除的地方
  4. check 所有信号
  5. check 所有增删改的审计日志

@wklken wklken modified the milestones: Y2022M37, Y2022M38 Sep 19, 2022
@wklken wklken closed this as completed Sep 23, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backlog 需求初始状态,等待产品进行评估 Layer: api Api module related Layer: saas SaaS module related Priority: High
Projects
None yet
Development

No branches or pull requests

2 participants