0.12.95 • Published 4 years ago

teambition-sdk v0.12.95

Weekly downloads
1,718
License
MIT
Repository
github
Last release
4 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

4 years ago

0.12.94

4 years ago

0.12.95

4 years ago

0.12.94-alpha.2

4 years ago

0.12.94-alpha.1

4 years ago

0.12.94-alpha.0

4 years ago

0.12.93

5 years ago

0.12.92-alpha.6

5 years ago

0.12.92-alpha.5

5 years ago

0.12.92-alpha.4

5 years ago

0.12.93-alpha.2

5 years ago

0.12.93-alpha.1

5 years ago

0.12.93-alpha.0

5 years ago

0.12.92

5 years ago

0.12.92-alpha.3

5 years ago

0.12.91-alpha.20

5 years ago

0.12.91-alpha.18

5 years ago

0.12.91-alpha.19

5 years ago

0.12.92-alpha.2

5 years ago

0.12.92-alpha.0

5 years ago

0.12.92-alpha.1

5 years ago

0.12.91

5 years ago

0.12.91-alpha.17

5 years ago

0.12.91-alpha.16

5 years ago

0.12.91-alpha.15

5 years ago

0.12.91-alpha.6

5 years ago

0.12.90

5 years ago

0.12.89

5 years ago

0.12.88

5 years ago

0.12.87

6 years ago

0.12.86

6 years ago

0.12.86-beta.0

6 years ago

0.12.85

6 years ago

0.12.85-beta.2

6 years ago

0.12.84

6 years ago

0.12.83

6 years ago

0.12.82

6 years ago

0.12.79-beta.4

6 years ago

0.12.81

6 years ago

0.12.80

6 years ago

0.12.79

6 years ago

0.12.78

6 years ago

0.12.77

6 years ago

0.12.76

6 years ago

0.12.76-beta.0

6 years ago

0.12.75

6 years ago

0.12.75-beta.0

6 years ago

0.12.74

6 years ago

0.12.73

6 years ago

0.12.73-beta.2

6 years ago

0.12.73-beta.1

6 years ago

0.12.73-beta.0

6 years ago

0.12.72

6 years ago

0.12.71

6 years ago

0.12.70

6 years ago

0.12.69

6 years ago

0.12.68

6 years ago

0.12.67

6 years ago

0.12.66

6 years ago

0.12.65

6 years ago

0.12.65-beta.0

6 years ago

0.12.64

7 years ago

0.12.64-beta.2

7 years ago

0.12.64-beta.1

7 years ago

0.12.64-beta.0

7 years ago

0.12.63

7 years ago

0.12.63-beta.0

7 years ago

0.12.62

7 years ago

0.12.62-beta.3

7 years ago

0.12.62-beta.2

7 years ago

0.12.62-beta.1

7 years ago

0.12.62-beta.0

7 years ago

0.12.61

7 years ago

0.12.60

7 years ago

0.12.59

7 years ago

0.12.58

7 years ago

0.12.57

7 years ago

0.12.56

7 years ago

0.12.55

7 years ago

0.12.54

7 years ago

0.12.53

7 years ago

0.12.52

7 years ago

0.12.51

7 years ago

0.12.50

7 years ago

0.6.29

7 years ago

0.12.49

7 years ago

0.12.48

7 years ago

0.12.47

7 years ago

0.12.46

7 years ago

0.12.45

7 years ago

0.12.44

7 years ago

0.12.43

7 years ago

0.12.42

7 years ago

0.12.41

7 years ago

0.12.40

7 years ago

0.12.40-alpha.4

7 years ago

0.12.39

7 years ago

0.12.38

7 years ago

0.12.37

7 years ago

0.12.36

7 years ago

0.12.35

7 years ago

0.12.34

7 years ago

0.12.33

7 years ago

0.12.32

7 years ago

0.12.31

7 years ago

0.12.30

7 years ago

0.12.29

7 years ago

0.6.28

7 years ago

0.12.28

7 years ago

0.12.27

7 years ago

0.12.26

7 years ago

0.12.25

7 years ago

0.12.24

7 years ago

0.12.23

7 years ago

0.12.22

7 years ago

0.12.21

7 years ago

0.12.20

7 years ago

0.12.19

7 years ago

0.12.18

7 years ago

0.12.17

7 years ago

0.12.16

7 years ago

0.12.15

7 years ago

0.12.14

7 years ago

0.12.13

7 years ago

0.12.12

7 years ago

0.12.11

7 years ago

0.6.27

8 years ago

0.12.10

8 years ago

0.6.26

8 years ago

0.6.25

8 years ago

0.12.9

8 years ago

0.12.8

8 years ago

0.12.7

8 years ago

0.12.6

8 years ago

0.12.5

8 years ago

0.12.4

8 years ago

0.11.12

8 years ago

0.12.3

8 years ago

0.12.2

8 years ago

0.12.1

8 years ago

0.11.11

8 years ago

0.11.10

8 years ago

0.11.9

8 years ago

0.12.0

8 years ago

0.11.8

8 years ago

0.6.22

8 years ago

0.6.21

8 years ago

0.11.7

8 years ago

0.6.20

8 years ago

0.6.18

8 years ago

0.6.17

8 years ago

0.11.6

8 years ago

0.6.15

8 years ago

0.11.5

8 years ago

0.11.4

8 years ago

0.11.3

8 years ago

0.6.13

8 years ago

0.6.12

8 years ago

0.11.2

8 years ago

0.11.1

8 years ago

0.11.0

8 years ago

0.9.4

8 years ago

0.9.3

8 years ago

0.9.2

8 years ago

0.9.1

8 years ago

0.9.0

8 years ago

0.8.30

8 years ago

0.8.29

8 years ago

0.8.28

8 years ago

0.8.27

8 years ago

0.8.26

8 years ago

0.8.25

8 years ago

0.8.24

8 years ago

0.8.23

8 years ago

0.8.22

8 years ago

0.8.21

8 years ago

0.6.11

8 years ago

0.9.0-alpha.2

8 years ago

0.9.0-alpha.1

8 years ago

0.8.20

8 years ago

0.8.20-alpha.2

8 years ago

0.8.19

8 years ago

0.8.18

8 years ago

0.8.17-alpha.2

8 years ago

0.8.17-alpha.1

8 years ago

0.8.17

8 years ago

0.8.16

8 years ago

0.8.15

8 years ago

0.8.14

8 years ago

0.8.13

8 years ago

0.8.12

8 years ago

0.8.11

9 years ago

0.8.11-alpha.4

9 years ago

0.8.11-alpha.3

9 years ago

0.8.11-alpha.2

9 years ago

0.8.11-alpha.1

9 years ago

0.8.11-alpha

9 years ago

0.6.10

9 years ago

0.8.10

9 years ago

0.8.9

9 years ago

0.8.8

9 years ago

0.8.7

9 years ago

0.8.6

9 years ago

0.8.5

9 years ago

0.6.9

9 years ago

0.8.4

9 years ago

0.8.4-alpha.0

9 years ago

0.8.3

9 years ago

0.8.2

9 years ago

0.8.2-alpha.5

9 years ago

0.8.2-alpha.4

9 years ago

0.8.2-alpha.3

9 years ago

0.8.2-alpha.2

9 years ago

0.8.2-alpha.1

9 years ago

0.8.2-alpha.0

9 years ago

0.8.1

9 years ago

0.8.1-alpha.0

9 years ago

0.8.0

9 years ago

0.7.8

9 years ago

0.7.7

9 years ago

0.7.6

9 years ago

0.7.5

9 years ago

0.7.4

9 years ago

0.7.3

9 years ago

0.7.2

9 years ago

0.7.1

9 years ago

0.7.0-alpha.23

9 years ago

0.7.0-alpha.22

9 years ago

0.7.0-alpha.21

9 years ago

0.7.0-alpha.20

9 years ago

0.7.0-alpha.19

9 years ago

0.7.0-alpha.18

9 years ago

0.7.0-alpha.17

9 years ago

0.7.0-alpha.16

9 years ago

0.7.0-alpha.15

9 years ago

0.7.0-alpha.14

9 years ago

0.7.0-alpha.13

9 years ago

0.7.0-alpha.12

9 years ago

0.7.0-alpha.11

9 years ago

0.7.0-alpha.10

9 years ago

0.7.0-alpha.9

9 years ago

0.7.0-alpha.8

9 years ago

0.7.0-alpha.7

9 years ago

0.7.0-alpha.6

9 years ago

0.7.0-alpha.5

9 years ago

0.7.0-alpha.4

9 years ago

0.6.8

9 years ago

0.6.7

9 years ago

0.7.0-alpha.3

9 years ago

0.7.0-alpha.2

9 years ago

0.7.0-alpha.1

9 years ago

0.6.6

9 years ago

0.6.5

9 years ago

0.6.4

9 years ago

0.6.3

9 years ago

0.6.2

9 years ago

0.6.1

9 years ago

0.5.3

9 years ago

0.6.0

9 years ago

0.6.0-rc.2

9 years ago

0.6.0-rc.1

9 years ago

0.5.0-beta.5

9 years ago

0.5.0-beta.4

9 years ago

0.5.2

9 years ago

0.5.0-beta.3

9 years ago

0.5.0-beta.2

9 years ago

0.5.0-beta.1

9 years ago

0.5.1

9 years ago

0.5.0

9 years ago

0.4.1

9 years ago

0.4.0

9 years ago

0.4.0-rc.2

9 years ago

0.4.0-rc.1

9 years ago

0.4.0-rc.0

9 years ago

0.4.0-alpha.6

9 years ago

0.4.0-alpha.5

9 years ago

0.4.0-alpha.4

9 years ago

0.4.0-alpha.3

9 years ago

0.4.0-alpha.2

9 years ago

0.4.0-alpha.1

9 years ago

0.3.7

9 years ago

0.3.6

9 years ago

0.3.5

9 years ago

0.3.4

9 years ago

0.3.3

9 years ago

0.3.2

9 years ago

0.3.1

9 years ago

0.3.0

9 years ago

0.2.21

10 years ago

0.2.20

10 years ago

0.2.19

10 years ago

0.2.18

10 years ago

0.2.17

10 years ago

0.2.16

10 years ago

0.2.15

10 years ago

0.2.14

10 years ago

0.2.13

10 years ago

0.2.12

10 years ago

0.2.11

10 years ago

0.2.10

10 years ago

0.2.9

10 years ago

0.2.8

10 years ago

0.2.7

10 years ago

0.2.6

10 years ago

0.2.5

10 years ago

0.2.4

10 years ago

0.2.3

10 years ago

0.2.2

10 years ago

0.2.1

10 years ago

0.2.0

10 years ago

0.1.0

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago

0.0.1

10 years ago