0.12.95 • Published 3 years ago

teambition-sdk v0.12.95

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

3 years ago

0.12.94

3 years ago

0.12.95

3 years ago

0.12.94-alpha.2

3 years ago

0.12.94-alpha.1

4 years ago

0.12.94-alpha.0

4 years ago

0.12.93

4 years ago

0.12.92-alpha.6

4 years ago

0.12.92-alpha.5

4 years ago

0.12.92-alpha.4

4 years ago

0.12.93-alpha.2

4 years ago

0.12.93-alpha.1

4 years ago

0.12.93-alpha.0

4 years ago

0.12.92

4 years ago

0.12.92-alpha.3

4 years ago

0.12.91-alpha.20

4 years ago

0.12.91-alpha.18

4 years ago

0.12.91-alpha.19

4 years ago

0.12.92-alpha.2

4 years ago

0.12.92-alpha.0

4 years ago

0.12.92-alpha.1

4 years ago

0.12.91

4 years ago

0.12.91-alpha.17

4 years ago

0.12.91-alpha.16

4 years ago

0.12.91-alpha.15

4 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

5 years ago

0.12.86

5 years ago

0.12.86-beta.0

5 years ago

0.12.85

5 years ago

0.12.85-beta.2

5 years ago

0.12.84

5 years ago

0.12.83

5 years ago

0.12.82

5 years ago

0.12.79-beta.4

5 years ago

0.12.81

5 years ago

0.12.80

5 years ago

0.12.79

5 years ago

0.12.78

5 years ago

0.12.77

5 years ago

0.12.76

5 years ago

0.12.76-beta.0

5 years ago

0.12.75

5 years ago

0.12.75-beta.0

5 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

6 years ago

0.12.64-beta.2

6 years ago

0.12.64-beta.1

6 years ago

0.12.64-beta.0

6 years ago

0.12.63

6 years ago

0.12.63-beta.0

6 years ago

0.12.62

6 years ago

0.12.62-beta.3

6 years ago

0.12.62-beta.2

6 years ago

0.12.62-beta.1

6 years ago

0.12.62-beta.0

6 years ago

0.12.61

6 years ago

0.12.60

6 years ago

0.12.59

6 years ago

0.12.58

6 years ago

0.12.57

6 years ago

0.12.56

6 years ago

0.12.55

6 years ago

0.12.54

6 years ago

0.12.53

6 years ago

0.12.52

6 years ago

0.12.51

6 years ago

0.12.50

6 years ago

0.6.29

6 years ago

0.12.49

6 years ago

0.12.48

6 years ago

0.12.47

6 years ago

0.12.46

6 years ago

0.12.45

6 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

7 years ago

0.12.10

7 years ago

0.6.26

7 years ago

0.6.25

7 years ago

0.12.9

7 years ago

0.12.8

7 years ago

0.12.7

7 years ago

0.12.6

7 years ago

0.12.5

7 years ago

0.12.4

7 years ago

0.11.12

7 years ago

0.12.3

7 years ago

0.12.2

7 years ago

0.12.1

7 years ago

0.11.11

7 years ago

0.11.10

7 years ago

0.11.9

7 years ago

0.12.0

7 years ago

0.11.8

7 years ago

0.6.22

7 years ago

0.6.21

7 years ago

0.11.7

7 years ago

0.6.20

7 years ago

0.6.18

7 years ago

0.6.17

7 years ago

0.11.6

7 years ago

0.6.15

7 years ago

0.11.5

7 years ago

0.11.4

7 years ago

0.11.3

7 years ago

0.6.13

7 years ago

0.6.12

7 years ago

0.11.2

7 years ago

0.11.1

7 years ago

0.11.0

7 years ago

0.9.4

7 years ago

0.9.3

7 years ago

0.9.2

7 years ago

0.9.1

7 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

8 years ago

0.8.11-alpha.4

8 years ago

0.8.11-alpha.3

8 years ago

0.8.11-alpha.2

8 years ago

0.8.11-alpha.1

8 years ago

0.8.11-alpha

8 years ago

0.6.10

8 years ago

0.8.10

8 years ago

0.8.9

8 years ago

0.8.8

8 years ago

0.8.7

8 years ago

0.8.6

8 years ago

0.8.5

8 years ago

0.6.9

8 years ago

0.8.4

8 years ago

0.8.4-alpha.0

8 years ago

0.8.3

8 years ago

0.8.2

8 years ago

0.8.2-alpha.5

8 years ago

0.8.2-alpha.4

8 years ago

0.8.2-alpha.3

8 years ago

0.8.2-alpha.2

8 years ago

0.8.2-alpha.1

8 years ago

0.8.2-alpha.0

8 years ago

0.8.1

8 years ago

0.8.1-alpha.0

8 years ago

0.8.0

8 years ago

0.7.8

8 years ago

0.7.7

8 years ago

0.7.6

8 years ago

0.7.5

8 years ago

0.7.4

8 years ago

0.7.3

8 years ago

0.7.2

8 years ago

0.7.1

8 years ago

0.7.0-alpha.23

8 years ago

0.7.0-alpha.22

8 years ago

0.7.0-alpha.21

8 years ago

0.7.0-alpha.20

8 years ago

0.7.0-alpha.19

8 years ago

0.7.0-alpha.18

8 years ago

0.7.0-alpha.17

8 years ago

0.7.0-alpha.16

8 years ago

0.7.0-alpha.15

8 years ago

0.7.0-alpha.14

8 years ago

0.7.0-alpha.13

8 years ago

0.7.0-alpha.12

8 years ago

0.7.0-alpha.11

8 years ago

0.7.0-alpha.10

8 years ago

0.7.0-alpha.9

8 years ago

0.7.0-alpha.8

8 years ago

0.7.0-alpha.7

8 years ago

0.7.0-alpha.6

8 years ago

0.7.0-alpha.5

8 years ago

0.7.0-alpha.4

8 years ago

0.6.8

8 years ago

0.6.7

8 years ago

0.7.0-alpha.3

8 years ago

0.7.0-alpha.2

8 years ago

0.7.0-alpha.1

8 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

9 years ago

0.2.20

9 years ago

0.2.19

9 years ago

0.2.18

9 years ago

0.2.17

9 years ago

0.2.16

9 years ago

0.2.15

9 years ago

0.2.14

9 years ago

0.2.13

9 years ago

0.2.12

9 years ago

0.2.11

9 years ago

0.2.10

9 years ago

0.2.9

9 years ago

0.2.8

9 years ago

0.2.7

9 years ago

0.2.6

9 years ago

0.2.5

9 years ago

0.2.4

9 years ago

0.2.3

9 years ago

0.2.2

9 years ago

0.2.1

9 years ago

0.2.0

9 years ago

0.1.0

9 years ago

0.0.3

9 years ago

0.0.2

9 years ago

0.0.1

9 years ago