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)
|