0.12.95 • Published 2 years ago

teambition-sdk v0.12.95

Weekly downloads
1,718
License
MIT
Repository
github
Last release
2 years ago

CircleCI Coverage Status Dependency Status devDependency Status

isomorphic-sdk for Teambition APIs

Greenkeeper badge

设计理念

SDK 主要解决的是数据同步的问题。通俗点讲,就是在前端使用数据模型模拟出数据库的增删改查等操作。

为什么会有这种需求? 以 https://api.teambition.com/tasks/:_id 为例, Teambition 的 API 会返回下面格式的数据:

{
  "_id": "001",
  "name": "task",
  "executor": {
    "_id": "002",
    "name": "executor 1",
    "avatarUrl": "https://xxx"
  },
  "subtasks": [
    {
      "_id": "003",
      "name": "subtask",
      "executor": {
        "_id": "004",
        "name": "executor 2",
        "avatarUrl": "https://xxx"
      }
    }
  ]
}

而倘若这个任务中包含的子对象,比如 executor 字段对应的数据通过其它 API 进行了变更:

/**
 * @url https://api.teambition.com/subtasks/:_id
 * @method put
 * @body {name: 'executor test'}
 */
SubtasksAPI.update('002', {
  name: 'subtask update'
})
  .subscribe()

在前端,需要自行处理与此 subtask 相关的所有变更情况。例如:

  1. 包含这个子任务的列表中的这个子任务名字的变更。
  2. 包含这个子任务的任务的详情页中,该子任务名字的变更。

然而在现有的 Teambition 数据模型中,需要在每一个 Model 或者 Collection 或者 View 中手动监听与自己相关联的数据,例如:

// 匹配第一种情况
class MyTasksView extends Backbone.View {
  ...
  listen() {
    this.listenTo(warehouse, ':change:task', model => {
      // handler
    })
    this.listenTo(warehouse, ':change:subtask', model => {
      // handler
    })
  }
}
// 匹配第二种情况

class SubtaskCollection extends Backbone.Collection {
  ...

  constructor() {
    this.on('add destroy remove change:isDone', () =>
      Socket.trigger(`:change:task/${this._boundToObjectId}`, {
        subtaskCount: {
          total: this.length
          done: this.getDoneSubTaskCount()
        }
      })
    )
  }
  getDoneSubTaskCount() {
    this.where({isDone: true}).length
  }
}

class TaskView extends Backbone.View {
  ...
  listen() {
    this.listenTo(this.taskModel, 'change', this.render)
  }
}

而在当前的设计中,所有的这种变更情况都在数据层处理,视图/业务 层只需要订阅一个数据源,这个数据源随后的所有变更都会通知到订阅者。 比如获取一个任务:

import 'rxjs/add/operator/distinctUntilKeyChanged'
import 'teambition-sdk/apis/task'
import { SDK } from 'teambition-sdk/SDK'
import { Component, Input } from '@angular/core'

@Component({
  selector: 'task-detail',
  template: `
    <div> {{ task$?.name | async }} </div>
    <div> {{ subtaskCount$ | async }} </div>
  `
})
export default class TaskView {

  @Input('taskId') taskId: string

  private task$ = this.SDK.getTask(this.taskId)
    .publishReplay(1)
    .refCount()

  private subtaskCount$ = this.task$
    .distinctUntilKeyChanged('subtasks')
    .map(task => ({
      total: task.subtasks.length,
      done: task.subtasks.filter(x => x.isDone).length
    }))
}

如果更加纯粹的使用 RxJS,甚至可以组合多种数据和业务:

import 'rxjs/add/operator/distinctUntilKeyChanged'
import 'rxjs/add/operator/distinctUntilChanged'
import 'teambition-sdk/apis/permission'
import 'teambition-sdk/apis/task'
import 'teambition-sdk/apis/project'
import { SDK } from 'teambition-sdk'
import { Component, Input } from '@angular/core'
import * as moment from 'moment'
import { errorHandler } from '../errorHandler'

@Component({
  selector: 'task-detail',
  template: `
    <div [ngClass]="{'active': permission$.canEdit | async}"></div>
    <div> {{ task$?.name | async }} </div>
    <div> {{ subtaskCount$ | async }} </div>
    <div> {{ dueDate$ | async }} </div>
  `
})
export default class TaskView {

  @Input('taskId') taskId: string

  private task$ = SDK.getTask(this.taskId)
    .catch(err => errorHandler(err))
    .publishReplay(1)
    .refCount()

  private subtaskCount$ = this.task$
    .distinctUntilKeyChanged('subtasks')
    .map(task => ({
      total: task.subtasks.length,
      done: task.subtasks.filter(x => x.isDone).length
    }))

  private dueDate$ = this.task$
    .map(task => moment(task.dueDate).format())

  private project$ = this.task$
    .distinctUntilKeyChanged('_projectId')
    .switchMap(task => SDK.getProject(task._projectId))
    .catch(err => errorHandler(err))
    .publishReplay(1)
    .refCount()

  private permission$ = this.task$
    .distinctUntilChanged((before, after) => {
      return before._executorId === after._executorId &&
        before._projectId === after._projectId
    })
    .switchMap(task => {
      return this.project$
        .distinctUntilKeyChanged('_defaultRoleId')
        .switchMap(project => {
          return SDK.getPermission(task, project)
        })
    })
    .catch(err => errorHandler(err))
    .publishReplay(1)
    .refCount()

在这种场景下,关于 task 的任何变更 (tasklist 变更,executor 变更,stage 变更等等,权限变化) 都能让相关的数据自动更新,从而简化 View 层的逻辑。

publish script

# only publish sdk
npm version xxx
npm run publish_sdk

# publish sdk, mock and socket
npm version xxx
npm run publish_all
0.12.95-alpha.1

2 years ago

0.12.94

2 years ago

0.12.95

2 years ago

0.12.94-alpha.2

2 years ago

0.12.94-alpha.1

3 years ago

0.12.94-alpha.0

3 years ago

0.12.93

3 years ago

0.12.92-alpha.6

3 years ago

0.12.92-alpha.5

3 years ago

0.12.92-alpha.4

3 years ago

0.12.93-alpha.2

3 years ago

0.12.93-alpha.1

3 years ago

0.12.93-alpha.0

3 years ago

0.12.92

3 years ago

0.12.92-alpha.3

3 years ago

0.12.91-alpha.20

3 years ago

0.12.91-alpha.18

3 years ago

0.12.91-alpha.19

3 years ago

0.12.92-alpha.2

3 years ago

0.12.92-alpha.0

3 years ago

0.12.92-alpha.1

3 years ago

0.12.91

3 years ago

0.12.91-alpha.17

3 years ago

0.12.91-alpha.16

3 years ago

0.12.91-alpha.15

3 years ago

0.12.91-alpha.6

3 years ago

0.12.90

4 years ago

0.12.89

4 years ago

0.12.88

4 years ago

0.12.87

4 years ago

0.12.86

4 years ago

0.12.86-beta.0

4 years ago

0.12.85

4 years ago

0.12.85-beta.2

4 years ago

0.12.84

4 years ago

0.12.83

4 years ago

0.12.82

4 years ago

0.12.79-beta.4

4 years ago

0.12.81

4 years ago

0.12.80

4 years ago

0.12.79

4 years ago

0.12.78

4 years ago

0.12.77

4 years ago

0.12.76

4 years ago

0.12.76-beta.0

4 years ago

0.12.75

4 years ago

0.12.75-beta.0

4 years ago

0.12.74

4 years ago

0.12.73

4 years ago

0.12.73-beta.2

4 years ago

0.12.73-beta.1

4 years ago

0.12.73-beta.0

4 years ago

0.12.72

4 years ago

0.12.71

5 years ago

0.12.70

5 years ago

0.12.69

5 years ago

0.12.68

5 years ago

0.12.67

5 years ago

0.12.66

5 years ago

0.12.65

5 years ago

0.12.65-beta.0

5 years ago

0.12.64

5 years ago

0.12.64-beta.2

5 years ago

0.12.64-beta.1

5 years ago

0.12.64-beta.0

5 years ago

0.12.63

5 years ago

0.12.63-beta.0

5 years ago

0.12.62

5 years ago

0.12.62-beta.3

5 years ago

0.12.62-beta.2

5 years ago

0.12.62-beta.1

5 years ago

0.12.62-beta.0

5 years ago

0.12.61

5 years ago

0.12.60

5 years ago

0.12.59

5 years ago

0.12.58

5 years ago

0.12.57

5 years ago

0.12.56

5 years ago

0.12.55

5 years ago

0.12.54

5 years ago

0.12.53

5 years ago

0.12.52

5 years ago

0.12.51

5 years ago

0.12.50

5 years ago

0.6.29

5 years ago

0.12.49

5 years ago

0.12.48

5 years ago

0.12.47

5 years ago

0.12.46

5 years ago

0.12.45

5 years ago

0.12.44

5 years ago

0.12.43

5 years ago

0.12.42

5 years ago

0.12.41

5 years ago

0.12.40

5 years ago

0.12.40-alpha.4

5 years ago

0.12.39

5 years ago

0.12.38

5 years ago

0.12.37

5 years ago

0.12.36

6 years ago

0.12.35

6 years ago

0.12.34

6 years ago

0.12.33

6 years ago

0.12.32

6 years ago

0.12.31

6 years ago

0.12.30

6 years ago

0.12.29

6 years ago

0.6.28

6 years ago

0.12.28

6 years ago

0.12.27

6 years ago

0.12.26

6 years ago

0.12.25

6 years ago

0.12.24

6 years ago

0.12.23

6 years ago

0.12.22

6 years ago

0.12.21

6 years ago

0.12.20

6 years ago

0.12.19

6 years ago

0.12.18

6 years ago

0.12.17

6 years ago

0.12.16

6 years ago

0.12.15

6 years ago

0.12.14

6 years ago

0.12.13

6 years ago

0.12.12

6 years ago

0.12.11

6 years ago

0.6.27

6 years ago

0.12.10

6 years ago

0.6.26

6 years ago

0.6.25

6 years ago

0.12.9

6 years ago

0.12.8

6 years ago

0.12.7

6 years ago

0.12.6

6 years ago

0.12.5

6 years ago

0.12.4

6 years ago

0.11.12

6 years ago

0.12.3

6 years ago

0.12.2

6 years ago

0.12.1

6 years ago

0.11.11

6 years ago

0.11.10

6 years ago

0.11.9

6 years ago

0.12.0

6 years ago

0.11.8

6 years ago

0.6.22

6 years ago

0.6.21

6 years ago

0.11.7

6 years ago

0.6.20

6 years ago

0.6.18

6 years ago

0.6.17

6 years ago

0.11.6

6 years ago

0.6.15

6 years ago

0.11.5

6 years ago

0.11.4

6 years ago

0.11.3

6 years ago

0.6.13

6 years ago

0.6.12

6 years ago

0.11.2

6 years ago

0.11.1

6 years ago

0.11.0

6 years ago

0.9.4

6 years ago

0.9.3

6 years ago

0.9.2

6 years ago

0.9.1

6 years ago

0.9.0

6 years ago

0.8.30

6 years ago

0.8.29

6 years ago

0.8.28

6 years ago

0.8.27

6 years ago

0.8.26

6 years ago

0.8.25

7 years ago

0.8.24

7 years ago

0.8.23

7 years ago

0.8.22

7 years ago

0.8.21

7 years ago

0.6.11

7 years ago

0.9.0-alpha.2

7 years ago

0.9.0-alpha.1

7 years ago

0.8.20

7 years ago

0.8.20-alpha.2

7 years ago

0.8.19

7 years ago

0.8.18

7 years ago

0.8.17-alpha.2

7 years ago

0.8.17-alpha.1

7 years ago

0.8.17

7 years ago

0.8.16

7 years ago

0.8.15

7 years ago

0.8.14

7 years ago

0.8.13

7 years ago

0.8.12

7 years ago

0.8.11

7 years ago

0.8.11-alpha.4

7 years ago

0.8.11-alpha.3

7 years ago

0.8.11-alpha.2

7 years ago

0.8.11-alpha.1

7 years ago

0.8.11-alpha

7 years ago

0.6.10

7 years ago

0.8.10

7 years ago

0.8.9

7 years ago

0.8.8

7 years ago

0.8.7

7 years ago

0.8.6

7 years ago

0.8.5

7 years ago

0.6.9

7 years ago

0.8.4

7 years ago

0.8.4-alpha.0

7 years ago

0.8.3

7 years ago

0.8.2

7 years ago

0.8.2-alpha.5

7 years ago

0.8.2-alpha.4

7 years ago

0.8.2-alpha.3

7 years ago

0.8.2-alpha.2

7 years ago

0.8.2-alpha.1

7 years ago

0.8.2-alpha.0

7 years ago

0.8.1

7 years ago

0.8.1-alpha.0

7 years ago

0.8.0

7 years ago

0.7.8

7 years ago

0.7.7

7 years ago

0.7.6

7 years ago

0.7.5

7 years ago

0.7.4

7 years ago

0.7.3

7 years ago

0.7.2

7 years ago

0.7.1

7 years ago

0.7.0-alpha.23

7 years ago

0.7.0-alpha.22

7 years ago

0.7.0-alpha.21

7 years ago

0.7.0-alpha.20

7 years ago

0.7.0-alpha.19

7 years ago

0.7.0-alpha.18

7 years ago

0.7.0-alpha.17

7 years ago

0.7.0-alpha.16

7 years ago

0.7.0-alpha.15

7 years ago

0.7.0-alpha.14

7 years ago

0.7.0-alpha.13

7 years ago

0.7.0-alpha.12

7 years ago

0.7.0-alpha.11

7 years ago

0.7.0-alpha.10

7 years ago

0.7.0-alpha.9

7 years ago

0.7.0-alpha.8

7 years ago

0.7.0-alpha.7

7 years ago

0.7.0-alpha.6

7 years ago

0.7.0-alpha.5

7 years ago

0.7.0-alpha.4

7 years ago

0.6.8

7 years ago

0.6.7

7 years ago

0.7.0-alpha.3

7 years ago

0.7.0-alpha.2

7 years ago

0.7.0-alpha.1

7 years ago

0.6.6

7 years ago

0.6.5

7 years ago

0.6.4

7 years ago

0.6.3

7 years ago

0.6.2

8 years ago

0.6.1

8 years ago

0.5.3

8 years ago

0.6.0

8 years ago

0.6.0-rc.2

8 years ago

0.6.0-rc.1

8 years ago

0.5.0-beta.5

8 years ago

0.5.0-beta.4

8 years ago

0.5.2

8 years ago

0.5.0-beta.3

8 years ago

0.5.0-beta.2

8 years ago

0.5.0-beta.1

8 years ago

0.5.1

8 years ago

0.5.0

8 years ago

0.4.1

8 years ago

0.4.0

8 years ago

0.4.0-rc.2

8 years ago

0.4.0-rc.1

8 years ago

0.4.0-rc.0

8 years ago

0.4.0-alpha.6

8 years ago

0.4.0-alpha.5

8 years ago

0.4.0-alpha.4

8 years ago

0.4.0-alpha.3

8 years ago

0.4.0-alpha.2

8 years ago

0.4.0-alpha.1

8 years ago

0.3.7

8 years ago

0.3.6

8 years ago

0.3.5

8 years ago

0.3.4

8 years ago

0.3.3

8 years ago

0.3.2

8 years ago

0.3.1

8 years ago

0.3.0

8 years ago

0.2.21

8 years ago

0.2.20

8 years ago

0.2.19

8 years ago

0.2.18

8 years ago

0.2.17

8 years ago

0.2.16

8 years ago

0.2.15

8 years ago

0.2.14

8 years ago

0.2.13

8 years ago

0.2.12

8 years ago

0.2.11

8 years ago

0.2.10

8 years ago

0.2.9

8 years ago

0.2.8

8 years ago

0.2.7

8 years ago

0.2.6

8 years ago

0.2.5

8 years ago

0.2.4

8 years ago

0.2.3

8 years ago

0.2.2

8 years ago

0.2.1

8 years ago

0.2.0

8 years ago

0.1.0

8 years ago

0.0.3

8 years ago

0.0.2

8 years ago

0.0.1

8 years ago