aboutsummaryrefslogtreecommitdiffstats
path: root/notes/data_model.md
blob: f13e33cce6ebc6365dec6b4023a9e7e728883fa0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

Entity list:

    container
    creator
    file
    release
    work

## Cookbook

To create a new work:

    login/create account

    match/lookup on first work; check if update actually needed
    ? match/lookup on files

    new edit group (under account; wip)
    new edit (under group)

    match/lookup on all creators
    match/lookup on all refs
      TODO: match/lookup on files?
    match/lookup container

    new work_rev (linked to edit)
    new work_ident (linked to rev; not-live)
    contributor stubs/links
    new release_rev (linked to work_ident)
    new release_ident (linked to rev; not-live)
    contributor stubs/links
    ref stubs/links
    new file_rev
    new file_ident

    set edit group state to "review"

    set edit group state to "accepted"
    set all ident flags to "live"


To edit, eg, a contributor:

    new edit group (under account; wip)
    new edit (under group)

    create contributor_rev row (and relationship rows)

    set edit group state to "review"

    set edit group state to "accepted"
    point ident row to new rev


Accept edit group:

    for each entity type:
      for each edit:
        update entity ident state (activate, redirect, delete)
    append log/changelog row
    update edit group state


Bulk/Fase Import Crossref:

    lookup work by identifier; if exists done
    lookup journals by ISSN
    lookup authors by ORCID
    create new work
      => stub container and authors if we can't find them
    create new release
    submit edit group


Import Journals (same for authors):

    lookup journal by ISSN
    create new container
    submit edit group

## Entity Schema

Each entity type has tables:

    _rev
      core representation of a version of the entity

    _ident
      persistent, external identifier
      allows merging, unmerging, stable cross-entity references

    _edit
      represents change metadata for a single change to one ident
      needed because an edit always changes ident, but might not change rev

Could someday also have:

    _log
      history of when edits were actually applied
      allows fast lookups of history of an entity (ident)
      unnecessary if we keep a log of edit group accepts?
      punt on this for now

## Entity States

    wip (not live; not redirect; has rev)
      activate
    active (live; not redirect; has rev)
      redirect
      delete
    redirect (live; redirect; rev or not)
      split
      delete
    deleted (live; not redirect; no rev)
      redirect
      activate

    "wip redirect" or "wip deleted" are invalid states

## Entity Endpoints/Actions

Actions could, in theory, be directed at any of:

    entities (ident)
    revision
    edit

A design decision to be made is how much to abstract away the distinction
between these three types (particularly the identifier/revision distinction).

Top-level entity actions (resulting in edits):

    create (new rev)
    redirect
    split
    update (new rev)
    delete

On existing entity edits (within a group):

    update
    delete

An edit group as a whole can be:

    create
    submit
    accept

Other per-entity endpoints:

    match (by field/context)
    lookup (by external persistent identifier)