Skip to content

Commit

Permalink
fix: 修复代码使用 joplin-api 的方式
Browse files Browse the repository at this point in the history
  • Loading branch information
rxliuli committed Jan 4, 2023
1 parent af156bd commit 6dfbdea
Show file tree
Hide file tree
Showing 15 changed files with 53 additions and 61 deletions.
13 changes: 7 additions & 6 deletions apps/joplin-batch-web/src/constants/joplinApiGenerator.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { Config, JoplinApiGenerator } from 'joplin-api'
import { config, Config } from 'joplin-api'
import { proxyStorage } from '@liuli-util/dom'

export const joplinApiGenerator = new JoplinApiGenerator()
const storage = proxyStorage<{ settings: Config }>(localStorage)
joplinApiGenerator.token = storage.settings?.token ?? ''
joplinApiGenerator.baseUrl = storage.settings?.baseUrl ?? 'http://localhost:41184'

export function openNote(id: string) {
const link = `joplin://x-callback-url/openNote?id=${id}`
window.open(link)
}

export function init() {
const storage = proxyStorage<{ settings: Config }>(localStorage)
config.token = storage.settings?.token ?? ''
config.baseUrl = storage.settings?.baseUrl ?? 'http://localhost:41184'
}
2 changes: 2 additions & 0 deletions apps/joplin-batch-web/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import { history, routeList } from './constants/router'
import LayoutView from './views/layout'
import { ReactRouter } from '@liuli-util/react-router'
import { createRoot } from 'react-dom/client'
import { init } from './constants/joplinApiGenerator'

init()
createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<ReactRouter history={history} routes={[{ path: '/', component: LayoutView, children: routeList }]} />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import * as React from 'react'
import { Button, Card, message } from 'antd'
import { i18n } from '../../constants/i18n'
import { joplinApiGenerator, openNote } from '../../constants/joplinApiGenerator'
import { openNote } from '../../constants/joplinApiGenerator'
import { noteApi } from 'joplin-api'

type CheckActionApiViewProps = {}

Expand All @@ -10,7 +11,7 @@ type CheckActionApiViewProps = {}
*/
export const CheckActionApiView: React.FC<CheckActionApiViewProps> = () => {
async function onOpen() {
const list = await joplinApiGenerator.noteApi.list({ limit: 1 })
const list = await noteApi.list({ limit: 1 })
if (list.items.length === 0) {
message.error('没有找到任何笔记')
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ import * as React from 'react'
import { useState } from 'react'
import { Button, Card, List, Typography } from 'antd'
import { useAsyncFn } from 'react-use'
import { joplinApiGenerator } from '../../constants/joplinApiGenerator'
import { CheckParentNotebookService } from './service/CheckParentNotebookService'
import { NoteProperties } from 'joplin-api'
import { noteApi, NoteProperties } from 'joplin-api'
import { i18n } from '../../constants/i18n'

const checkParentNotebookService = new CheckParentNotebookService()
Expand All @@ -21,7 +20,7 @@ export const CheckParentNotebookView: React.FC = () => {
})

async function onRemove(id: string) {
await joplinApiGenerator.noteApi.remove(id)
await noteApi.remove(id)
setList((list) => list.filter((item) => item.id !== id))
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import { treeToList } from '@liuli-util/tree'
import { joplinApiGenerator } from '../../../constants/joplinApiGenerator'
import { PageUtil } from 'joplin-api'
import { folderApi, noteApi, PageUtil } from 'joplin-api'
import { NoteProperties } from 'joplin-api'

export class CheckParentNotebookService {
async check(): Promise<Pick<NoteProperties, 'id' | 'title' | 'parent_id'>[]> {
const folderIdSet = new Set(
treeToList(await joplinApiGenerator.folderApi.listAll(), {
treeToList(await folderApi.listAll(), {
id: 'id',
path: 'path',
children: 'children',
}).map((folder) => folder.id),
)
const list = await PageUtil.pageToAllList(joplinApiGenerator.noteApi.list.bind(joplinApiGenerator.noteApi), {
const list = await PageUtil.pageToAllList(noteApi.list.bind(noteApi), {
fields: ['id', 'title', 'parent_id'],
order_by: 'user_updated_time',
order_dir: 'DESC',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { NoteProperties } from 'joplin-api'
import { noteApi, NoteProperties, searchApi } from 'joplin-api'
import { PageUtil } from 'joplin-api'
import { AsyncArray } from '@liuli-util/async'
import type { ContentLink, MarkdownLinkUtil } from './MarkdownLinkUtil'
import MarkdownLinkUtilWorker from './MarkdownLinkUtil?worker'
import { wrap } from 'comlink'
import { joplinApiGenerator } from '../../../constants/joplinApiGenerator'

export type NoteModel = Pick<NoteProperties, 'id' | 'title' | 'body' | 'user_updated_time'> & {
urls: MappingContentLink[]
Expand All @@ -21,7 +20,7 @@ export class ConvertExternalLinkService {
* @param linkPrefix
*/
async search(linkPrefix: string): Promise<NoteModel[]> {
const list = await PageUtil.pageToAllList(joplinApiGenerator.searchApi.search.bind(joplinApiGenerator.searchApi), {
const list = await PageUtil.pageToAllList(searchApi.search.bind(searchApi), {
query: `body:"${linkPrefix}"`,
fields: ['id', 'title', 'body', 'user_updated_time'],
order_by: 'user_updated_time',
Expand Down Expand Up @@ -51,7 +50,7 @@ export class ConvertExternalLinkService {
return link
}
const matchNotes = (
await joplinApiGenerator.searchApi.search({
await searchApi.search({
query: `title:"${link.title}"`,
limit: 3,
fields: ['id', 'title'],
Expand All @@ -71,9 +70,9 @@ export class ConvertExternalLinkService {
* @param convertLinkMap
*/
async convert(id: string, convertLinkMap: Record<string, ContentLink>) {
const note = await joplinApiGenerator.noteApi.get(id, ['id', 'body'])
const note = await noteApi.get(id, ['id', 'body'])
const content = await this.markdownLinkUtilWorker.convertLink(note.body, convertLinkMap)
await joplinApiGenerator.noteApi.update({
await noteApi.update({
id: note.id,
body: content,
user_updated_time: Date.now(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import { useState } from 'react'
import { i18n } from '../../constants/i18n'
import { Button, Card, Image, List, message, Space, SpinProps } from 'antd'
import { useAsyncFn } from 'react-use'
import { PageUtil } from 'joplin-api'
import { PageUtil, resourceApi } from 'joplin-api'
import { buildResourceUrl } from '../unusedResource/UnusedResourceView'
import { joplinApiGenerator } from '../../constants/joplinApiGenerator'
import { ResourceProperties } from 'joplin-api'
import { AsyncArray, asyncLimiting } from '@liuli-util/async'
import { MimeUtils } from './util/MimeUtils'
Expand All @@ -15,7 +14,7 @@ export const FixFileExtensionView: React.FC = () => {
const [loadState, fetch] = useAsyncFn(async () => {
setList(
(
await PageUtil.pageToAllList(joplinApiGenerator.resourceApi.list.bind(joplinApiGenerator.resourceApi), {
await PageUtil.pageToAllList(resourceApi.list.bind(resourceApi), {
fields: ['id', 'title', 'file_extension', 'mime'],
})
)
Expand All @@ -34,7 +33,7 @@ export const FixFileExtensionView: React.FC = () => {
await AsyncArray.forEach(
list,
asyncLimiting(async (item) => {
await joplinApiGenerator.resourceApi.update({
await resourceApi.update({
id: item.id,
file_extension: item.file_extension,
})
Expand Down
1 change: 1 addition & 0 deletions apps/joplin-batch-web/src/views/home/HomeView.module.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
.home img {
width: 100%;
max-width: 980px;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ import * as React from 'react'
import { useState } from 'react'
import { Button, Card, List, SpinProps } from 'antd'
import { useAsyncFn } from 'react-use'
import { joplinApiGenerator, openNote } from '../../constants/joplinApiGenerator'
import { openNote } from '../../constants/joplinApiGenerator'
import { NotFoundResourceCheckService } from './service/NotFoundResourceCheckService'
import { ResourceProperties } from 'joplin-api'
import { NoteProperties } from 'joplin-api'
import css from './NotFoundResourceCheckView.module.css'
import { i18n } from '../../constants/i18n'

const notFoundResourceCheckService = new NotFoundResourceCheckService(joplinApiGenerator)
const notFoundResourceCheckService = new NotFoundResourceCheckService()

/**
* 检查笔记中引用失效的资源
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { JoplinApiGenerator, PageUtil } from 'joplin-api'
import { noteApi, PageUtil, resourceApi } from 'joplin-api'
import { ResourceProperties } from 'joplin-api'
import { parseInternalLink } from './parseInternalLink'
import { AsyncArray, asyncLimiting } from '@liuli-util/async'
Expand All @@ -17,15 +17,15 @@ interface CheckErrorResourceEvents {
}

export class NotFoundResourceCheckService {
constructor(private readonly config: JoplinApiGenerator) {}
constructor() {}

check() {
return PromiseUtil.warpOnEvent(async (events: CheckErrorResourceEvents) => {
events.load(i18n.t('notFoundResource.loadResources'))
const resourceIdSet = new Set((await this.getAllResourceIdList()).map((item) => item.id))
events.load(i18n.t('notFoundResource.loadNotes'))
const noteList: Pick<NoteProperties, 'id' | 'title' | 'body' | 'user_updated_time'>[] =
await PageUtil.pageToAllList(this.config.noteApi.list.bind(this.config.noteApi), {
await PageUtil.pageToAllList(noteApi.list.bind(noteApi), {
fields: ['id', 'title', 'body', 'user_updated_time'],
})
const noteIdSet = noteList.reduce((res, item) => res.add(item.id), new Set<string>())
Expand Down Expand Up @@ -67,7 +67,7 @@ export class NotFoundResourceCheckService {
}

async getAllResourceIdList() {
return (await PageUtil.pageToAllList(this.config.resourceApi.list.bind(this.config.resourceApi), {
return (await PageUtil.pageToAllList(resourceApi.list.bind(resourceApi), {
fields: ['id', 'title', 'mime'] as (keyof ResourceProperties)[],
})) as Pick<ResourceProperties, 'id'>[]
}
Expand Down
9 changes: 4 additions & 5 deletions apps/joplin-batch-web/src/views/replace/ReplaceView.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { Button, Card, Form, Input, List, message, Space, Checkbox } from 'antd'
import React, { useState } from 'react'
import css from './ReplaceView.module.css'
import { TypeEnum } from 'joplin-api'
import { joplinApiGenerator } from '../../constants/joplinApiGenerator'
import { noteApi, searchApi, TypeEnum } from 'joplin-api'
import { NoteProperties } from 'joplin-api'
import Highlighter from 'react-highlight-words'
import { AsyncArray, asyncLimiting } from '@liuli-util/async'
Expand All @@ -23,7 +22,7 @@ export const ReplaceView: React.FC = () => {
async function onSearch() {
const values = form.getFieldsValue()
console.log('onSearch: ', values)
const res = await joplinApiGenerator.searchApi.search({
const res = await searchApi.search({
query: `body:${values.keyword}`,
type: TypeEnum.Note,
limit: 100,
Expand All @@ -38,7 +37,7 @@ export const ReplaceView: React.FC = () => {

async function onReplace(item: SearchNote) {
const values = form.getFieldsValue()
await joplinApiGenerator.noteApi.update({
await noteApi.update({
id: item.id,
user_updated_time: keepUpdatedTime ? item.user_updated_time : undefined,
body: item.body.replaceAll(values.keyword, values.replaceText),
Expand All @@ -62,7 +61,7 @@ export const ReplaceView: React.FC = () => {
await AsyncArray.forEach(
list,
asyncLimiting(async (item) => {
await joplinApiGenerator.noteApi.update({
await noteApi.update({
id: item.id,
user_updated_time: keepUpdatedTime ? item.user_updated_time : undefined,
body: item.body.replaceAll(values.keyword, values.replaceText),
Expand Down
9 changes: 4 additions & 5 deletions apps/joplin-batch-web/src/views/settings/SettingsView.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import * as React from 'react'
import { Button, Card, Form, Input, message } from 'antd'
import { Config } from 'joplin-api'
import { config, Config, noteApi } from 'joplin-api'
import { useLocalStorage } from 'react-use'
import { joplinApiGenerator } from '../../constants/joplinApiGenerator'
import { i18n } from '../../constants/i18n'

export const SettingsView: React.FC = () => {
Expand All @@ -15,9 +14,9 @@ export const SettingsView: React.FC = () => {
const values = form.getFieldsValue()
console.log('onFinish: ', values)
try {
joplinApiGenerator.token = values.token
joplinApiGenerator.baseUrl = values.baseUrl
await joplinApiGenerator.noteApi.list({ limit: 1 })
config.token = values.token
config.baseUrl = values.baseUrl
await noteApi.list({ limit: 1 })
setSettings(values)
message.success(i18n.t('settings.msg.success'))
} catch (e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,21 @@ import * as React from 'react'
import { useState } from 'react'
import { Button, Card, Image, List, message, Space, SpinProps } from 'antd'
import { UnusedResourceService } from './service/UnusedResourceService'
import { joplinApiGenerator } from '../../constants/joplinApiGenerator'
import { useAsyncFn } from 'react-use'
import { Config } from 'joplin-api'
import { Config, resourceApi } from 'joplin-api'
import { downloadUrl, proxyStorage } from '@liuli-util/dom'
import produce from 'immer'
import { AsyncArray } from '@liuli-util/async'
import { i18n } from '../../constants/i18n'
import { ResourceProperties } from 'joplin-api'

const unusedResourceService = new UnusedResourceService(joplinApiGenerator)
const unusedResourceService = new UnusedResourceService()

function resourceUrlBuilder(getConfig: () => Config | null | undefined) {
const settings = getConfig()
return (id: string) => `${settings?.baseUrl}/resources/${id}/file?token=${settings?.token}`
export function buildResourceUrl(id: string) {
const settings = proxyStorage<{ settings: Config }>(localStorage).settings
return `${settings?.baseUrl}/resources/${id}/file?token=${settings?.token}`
}

export const buildResourceUrl = resourceUrlBuilder(() => proxyStorage<{ settings: Config }>(localStorage).settings)

/**
* 检查未使用的资源
*/
Expand All @@ -40,7 +37,7 @@ export const UnusedResourceView: React.FC = () => {

async function onRemoveResource(id: string) {
setList(produce((list) => list.filter((item) => item.id !== id)))
await joplinApiGenerator.resourceApi.remove(id)
await resourceApi.remove(id)
}

async function onOpenResource(id: string) {
Expand All @@ -49,7 +46,7 @@ export const UnusedResourceView: React.FC = () => {

const [onRemoveAllState, onRemoveAll] = useAsyncFn(async () => {
await AsyncArray.forEach(list, async (item) => {
await joplinApiGenerator.resourceApi.remove(item.id)
await resourceApi.remove(item.id)
})
setList([])
}, [list])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { JoplinApiGenerator } from 'joplin-api'
import { AsyncArray, asyncLimiting } from '@liuli-util/async'
import { PageUtil } from 'joplin-api'
import { PageUtil, resourceApi, searchApi } from 'joplin-api'
import { PromiseUtil } from '../../../common/PromiseUtil'
import { ResourceProperties } from 'joplin-api'

Expand All @@ -15,14 +14,12 @@ export type ProcessEvents = {
}

export class UnusedResourceService {
constructor(private readonly config: JoplinApiGenerator) {}

/**
* 获取所有的资源
*/
getUnusedResource() {
return PromiseUtil.warpOnEvent(async (events: ProcessEvents) => {
const resourceList = (await PageUtil.pageToAllList(this.config.resourceApi.list.bind(this.config.resourceApi), {
const resourceList = (await PageUtil.pageToAllList(resourceApi.list.bind(resourceApi), {
fields: ['id', 'title', 'mime'] as (keyof ResourceProperties)[],
})) as Pick<ResourceProperties, 'id' | 'title' | 'mime'>[]
let i = 0
Expand All @@ -46,7 +43,7 @@ export class UnusedResourceService {
* @param id
*/
async checkUsed(id: string): Promise<boolean> {
const res = await this.config.searchApi.search({
const res = await searchApi.search({
query: `"](:/${id})"`,
})
return res.items.length > 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import { expect, it, describe } from 'vitest'
import { PageUtil } from 'joplin-api'
import { PageUtil, resourceApi } from 'joplin-api'
import { UnusedResourceService } from '../UnusedResourceService'
import { joplinApiGenerator } from '../../../../constants/joplinApiGenerator'

describe('测试 UnusedResourceService', () => {
describe('测试 joplin api', () => {
it('测试 checkUsed', async () => {
const unusedResourceService = new UnusedResourceService(joplinApiGenerator)
const unusedResourceService = new UnusedResourceService()
const usedId = '9a54a3b73dbc438aa65023e7b6f581c4'
const unusedId = 'faf99736d4bd4a0b8d2b959887635f73'
expect(await unusedResourceService.checkUsed(usedId)).toBeTruthy()
expect(await unusedResourceService.checkUsed(unusedId)).toBeFalsy()
})
})
it('测试获取所有附件资源', async () => {
const list = await PageUtil.pageToAllList(joplinApiGenerator.resourceApi.list.bind(joplinApiGenerator.resourceApi))
const list = await PageUtil.pageToAllList(resourceApi.list.bind(resourceApi))
console.log(list)
})
})

0 comments on commit 6dfbdea

Please sign in to comment.