Skip to content

Commit

Permalink
feat: #801 强化GitHub平台和Gitlab平台的校验
Browse files Browse the repository at this point in the history
  • Loading branch information
terwer committed Oct 28, 2023
1 parent 6a8d291 commit 3cbfcd6
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 44 deletions.
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@
"vue-i18n": "^9.6.1",
"vue-router": "^4.2.5",
"xmlbuilder2": "^3.1.1",
"zhi-blog-api": "^1.46.5",
"zhi-blog-api": "^1.47.0",
"zhi-common": "^1.25.0",
"zhi-device": "^2.10.0",
"zhi-fetch-middleware": "^0.7.11",
"zhi-github-middleware": "^0.4.8",
"zhi-gitlab-middleware": "^0.6.18",
"zhi-lib-base": "^0.8.0",
"zhi-notion-markdown": "^0.1.4",
"zhi-siyuan-api": "^2.11.5",
"zhi-siyuan-api": "^2.11.6",
"zhi-xmlrpc-middleware": "^0.6.11"
}
}
20 changes: 10 additions & 10 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions src/adaptors/api/base/baseBlogApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ export class BaseBlogApi extends BlogApi {
this.proxyFetch = proxyFetch
}

public async checkAuth(): Promise<boolean> {
return true
}

public getYamlAdaptor(): YamlConvertAdaptor {
return null
}
Expand Down
28 changes: 28 additions & 0 deletions src/adaptors/api/base/github/commonGithubApiAdaptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,23 @@ class CommonGithubApiAdaptor extends BaseBlogApi {
this.githubClient = new CommonGithubClient(githubConfig)
}

public async checkAuth(): Promise<boolean> {
let flag: boolean
try {
const testFilePath = `test.md`
await this.safeDeletePost(testFilePath)
const res = await this.githubClient.publishGithubPage(testFilePath, "Hello, World!")
await this.safeDeletePost(testFilePath)
flag = !StrUtil.isEmptyString(res?.content?.path)
} catch (e) {
this.logger.info(`checkAuth error =>`, e)
flag = false
}

this.logger.info(`checkAuth finished => ${flag}`)
return flag
}

public async getUsersBlogs(): Promise<UserBlog[]> {
const result: UserBlog[] = []

Expand Down Expand Up @@ -204,6 +221,17 @@ class CommonGithubApiAdaptor extends BaseBlogApi {

return previewUrl
}

// ================
// private methods
// ================
public async safeDeletePost(postid: string): Promise<boolean> {
try {
await this.githubClient.deleteGithubPage(postid)
} catch (e) {}

return true
}
}

export { CommonGithubApiAdaptor }
28 changes: 28 additions & 0 deletions src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,23 @@ class CommonGitlabApiAdaptor extends BaseBlogApi {
)
}

public async checkAuth(): Promise<boolean> {
let flag: boolean
try {
const testFilePath = `test.md`
await this.safeDeletePost(testFilePath)
const res = await this.gitlabClient.createRepositoryFile(testFilePath, "Hello, World!")
await this.safeDeletePost(testFilePath)
flag = !StrUtil.isEmptyString(res?.file_path)
} catch (e) {
this.logger.info(`checkAuth error =>`, e)
flag = false
}

this.logger.info(`checkAuth finished => ${flag}`)
return flag
}

public async getUsersBlogs(): Promise<UserBlog[]> {
const result: UserBlog[] = []

Expand Down Expand Up @@ -211,6 +228,17 @@ class CommonGitlabApiAdaptor extends BaseBlogApi {

return previewUrl
}

// ================
// private methods
// ================
private async safeDeletePost(postid: string): Promise<boolean> {
try {
await this.gitlabClient.deleteRepositoryFile(postid)
} catch (e) {}

return true
}
}

export { CommonGitlabApiAdaptor }
4 changes: 4 additions & 0 deletions src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ class MetaweblogBlogApiAdaptor extends BaseBlogApi {
this.proxyXmlrpc = proxyXmlrpc
}

public async checkAuth(): Promise<boolean> {
return true
}

public override async getUsersBlogs(): Promise<Array<UserBlog>> {
let result: UserBlog[] = []
result = await this.metaweblogCall(MetaweblogConstants.METHOD_GET_USERS_BLOGS, [
Expand Down
4 changes: 4 additions & 0 deletions src/adaptors/web/base/baseWebApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ class BaseWebApi extends WebApi {
this.proxyFetch = proxyFetch
}

public async checkAuth(): Promise<boolean> {
return true
}

// web 适配器专有
public updateCfg(cfg: WebConfig) {
this.cfg = cfg
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import { SypConfig } from "~/syp.config.ts"
import { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts"
import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common"
import { DYNAMIC_CONFIG_KEY } from "~/src/utils/constants.ts"
import { PageTypeEnum, PasswordType } from "zhi-blog-api"
import { BlogAdaptor, PageTypeEnum, PasswordType } from "zhi-blog-api"
import Adaptors from "~/src/adaptors"
import { Utils } from "~/src/utils/utils.ts"
import { ElMessage } from "element-plus"
Expand Down Expand Up @@ -121,45 +121,45 @@ const valiConf = async () => {
isLoading.value = true
let errMsg: any
const commonblogApiAdaptor = await Adaptors.getAdaptor(props.apiType, formData.cfg as any)
const api = Utils.blogApi(appInstance, commonblogApiAdaptor) as BlogAdaptor
try {
const commonblogApiAdaptor = await Adaptors.getAdaptor(props.apiType, formData.cfg as any)
logger.debug("commonblogApiAdaptor=>", commonblogApiAdaptor)
const api = Utils.blogApi(appInstance, commonblogApiAdaptor)
const usersBlogs = await api.getUsersBlogs(formData.ksKeyword)
if (usersBlogs && usersBlogs.length > 0) {
// 首次未保存验证的时候才去更新
if (StrUtil.isEmptyString(formData.cfg?.blogid)) {
// 首次验证需要初始化下拉选择
if (formData.kwSpaces.length == 0) {
usersBlogs.forEach((item) => {
const kwItem = {
label: item.blogName,
value: item.blogid,
}
formData.kwSpaces.push(kwItem)
})
await api.checkAuth()
try {
await afterValid(api)
formData.cfg.apiStatus = true
} catch (e2) {
formData.cfg.apiStatus = false
errMsg = e2.toString()
}
logger.info("======校验正常结束======")
} catch (e) {
if (typeof e === "boolean") {
if (e === true) {
try {
await afterValid(api)
formData.cfg.apiStatus = true
} catch (e2) {
formData.cfg.apiStatus = false
errMsg = e2.toString()
}
// 初始化选中
const userBlog = usersBlogs[0]
formData.cfg.blogid = userBlog.blogid
formData.cfg.blogName = userBlog.blogName
} else {
formData.cfg.apiStatus = false
errMsg = "校验失败,请检查平台配置"
}
formData.cfg.apiStatus = true
logger.info("======校验修正结束======")
} else {
errMsg = "接口返回信息不完整,请检查接口适配器"
formData.cfg.apiStatus = false
errMsg = e.toString()
logger.error(t("main.opt.failure") + "=>", e)
}
} catch (e) {
formData.cfg.apiStatus = false
errMsg = e
logger.error(t("main.opt.failure") + "=>", e)
}
if (!formData.cfg.apiStatus) {
logger.error(errMsg.toString())
ElMessage.error(t("setting.blog.vali.error") + "=>" + errMsg)
const errMsg2 = t("setting.blog.vali.error") + `=>${errMsg.toString()}`
logger.error(errMsg2)
ElMessage.error(errMsg2)
} else {
ElMessage.success(t("main.opt.success"))
}
Expand All @@ -173,6 +173,31 @@ const valiConf = async () => {
logger.debug("Commonblog通用Setting验证完毕")
}
const afterValid = async (api) => {
// 验证成功就去初始化知识空间
const usersBlogs = await api.getUsersBlogs(formData.ksKeyword)
if (usersBlogs && usersBlogs.length > 0) {
// 首次未保存验证的时候才去更新
if (StrUtil.isEmptyString(formData.cfg?.blogid)) {
// 首次验证需要初始化下拉选择
if (formData.kwSpaces.length == 0) {
usersBlogs.forEach((item) => {
const kwItem = {
label: item.blogName,
value: item.blogid,
}
formData.kwSpaces.push(kwItem)
})
}
// 初始化选中
const userBlog = usersBlogs[0]
formData.cfg.blogid = userBlog.blogid
formData.cfg.blogName = userBlog.blogName
}
}
}
const saveConf = async (hideTip?: any) => {
logger.debug("prepare to store cfg=>", {
cfg: toRaw(formData.cfg),
Expand Down
8 changes: 6 additions & 2 deletions src/composables/useProxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,14 @@ const useProxy = (middlewareUrl?: string) => {
if (!(fetchResult.status >= 200 && fetchResult.status < 300)) {
// 兼容 CSDN 错误提示
const bodyJson = JsonUtil.safeParse<any>(fetchResult?.body, {})
if (bodyJson?.msg) {
if (!StrUtil.isEmptyString(bodyJson?.msg)) {
throw new Error(bodyJson?.msg)
}
throw new Error(StrUtil.decodeUnicodeToChinese(fetchResult?.body))
throw new Error(
StrUtil.decodeUnicodeToChinese(
StrUtil.isEmptyString(fetchResult?.body) ? `请求异常:${fetchResult.status}` : fetchResult?.body
)
)
}

if (contentType === "application/json") {
Expand Down

0 comments on commit 3cbfcd6

Please sign in to comment.