Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 598 lines (469 sloc) 21.19 kb
fe2c9fe3 »
2012-03-06 Update SEQ_TODO
1 #+SEQ_TODO: MAYBE SOMEDAY BLOCKED TODO IN_PROGRESS | DONE
4b35750c »
2012-02-18 README added
2
3 * Overview
4 This snaplet provides create-read-update-delete operations for any
449b2cc9 »
2012-03-29 Rewrite README
5 JSON objects with Redis storage. Role-based permissions system is
6 supported.
4b35750c »
2012-02-18 README added
7
449b2cc9 »
2012-03-29 Rewrite README
8 Primary notion of Redson is a model, or form, which is a named
9 collection of fields with certain extra annotations. Every filled
10 form («instance of model») has unique ID when stored in Redis.
4b35750c »
2012-02-18 README added
11
449b2cc9 »
2012-03-29 Rewrite README
12 Models must be defined prior to usage with special syntax.
13 Transparent mode is supported in which model definitions are not
14 checked, but permissions engine is unavailable as well. Certain
15 transformations may be applied to model definition by server and
16 served to client (see «served models»).
4b35750c »
2012-02-18 README added
17
449b2cc9 »
2012-03-29 Rewrite README
18 ** Models
4b35750c »
2012-02-18 README added
19
449b2cc9 »
2012-03-29 Rewrite README
20 Prior to reading and writing form data, the server reads form
21 (model) definition from JSON files stored in directory set by
22 `models-directory` setting (defaults to `resources/models/`),
23 unless `transparent-mode` setting is set to `true` (see below).
4b35750c »
2012-02-18 README added
24
449b2cc9 »
2012-03-29 Rewrite README
25 Valid keys for form and fields are listed below, with non-required
26 fields marked by /slant/.
27
28 *** Model name
29 Consider a model is stored in `scp.js` file; we define
30 modelname as filename without extension (`scp`), which is used in URL
31 to access forms built from this model.
32
33 *** Valid form keys
34 **** name
35 Internal name of model. Must match the basename of JSON file
36 model definition is stored in.
37 **** title
38 Human-readable form title.
39 **** /canCreate / canUpdate / canRead / canDelete/
40 Each field lists roles having access to specific CRUD methods
41 for model. Boolean values may be used instead of role lists as
42 well, with `false` meaning «none of the roles» and `true`
43 meaning «all the roles». Empty list is the same as `false`.
44
45 Implementation follows these rules:
46
47 - `canCreate` implies `canUpdate` permission.
48
49 Note that per-field permissions are still checked after
50 whole-form ones succeed.
51
52 If field is not included in model definition, `false` is
53 implied.
54
55 Attempt to violate permissions results in 403 Forbidden error.
56
57 **** fields
58 List of field objects, where every field object has keys listed
59 below.
60
f29e16de »
2012-03-29 Field applications
61 **** applications
62 List of application objects which target many fields at once (see
63 below).
449b2cc9 »
2012-03-29 Rewrite README
64 *** Valid field keys
65 **** name
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
66
449b2cc9 »
2012-03-29 Rewrite README
67 Field object must include `name` key which is the internal name of
68 the field.
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
69
449b2cc9 »
2012-03-29 Rewrite README
70 `class` cannot be used as a field name.
0da296e8 »
2012-03-01 More clarifications on permissions system
71
449b2cc9 »
2012-03-29 Rewrite README
72 **** /type/
73
74 Type system currently does not impose any checks on server side.
75 Following values are proposed for `type`:
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
76
449b2cc9 »
2012-03-29 Rewrite README
77 - "text",
78 - "textarea",
79 - "checkbox",
80 - "dictionary",
81 - "reference"
87b9c1c6 »
2012-03-22 Support arbitary annotations for fields.
82
449b2cc9 »
2012-03-29 Rewrite README
83 Default field type is `text`
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
84
449b2cc9 »
2012-03-29 Rewrite README
85 Client uses type data to properly render field contents.
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
86
449b2cc9 »
2012-03-29 Rewrite README
87 If type of field is `reference`, then field holds a number of
88 references to another form instances. The client may provide
89 interface to edit or view the subform. The actual value provided
90 for the form field with `reference` type should be
91 comma-separated list of `<formname>:<instanceid>` strings, where
92 `<formname>` is the name of form to which the reference is
93 stored and `<instanceid>` is the id of specific instance of that
94 form.
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
95
449b2cc9 »
2012-03-29 Rewrite README
96 **** /canRead / canWrite/
97 Per-field permissions have the same syntax as per-field per-form
98 permissions. Only readable fields are served to client and only
99 writable are allowed to be changed by client.
9db53729 »
2012-03-05 More todos
100
449b2cc9 »
2012-03-29 Rewrite README
101 Implementation generally follows these rules:
24a7088a »
2012-03-08 Describe dictionary
102
449b2cc9 »
2012-03-29 Rewrite README
103 - If field is unreadable, then client must not render it.
104
105 - If field is not writable by user, then form input element must
106 be inactive.
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
107
449b2cc9 »
2012-03-29 Rewrite README
108 - `canWrite` implies `canRead`.
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
109
449b2cc9 »
2012-03-29 Rewrite README
110 - Client does not attempt to write inaccessible fields to server
111 and does not expect unreadable fields in server response.
f8d85758 »
2012-02-26 Describe metamodel and permissions
112
449b2cc9 »
2012-03-29 Rewrite README
113
114 **** /groupName/
115 If `groupName` key is present, its values must be equal to name
116 of one of the complex field groups as described in group fields
117 file. When server processes model description, such fields are
118 spliced into list of fields as described for that group (see
119 below).
120 **** /index/
121 Boolean which instructs server to create or update exact reverse
122 index on that field on create/update/delete operations.
123
124 Redis key used is <modelname>:<field>:<value>, value stored is a
125 set of instance ids with that value for indexed field.
126 **** /indexCollate/
127 If field has index=true, then indexCollate instructs Redson
128 whether or not to perform string cleaning (removing punctuation,
129 space, lower-case conversion) prior to saving index values and
130 performing an ad-hoc search against them. Defaults to false. Set
131 this to true if you want to search by names or other
132 user-provided strings.
133
134 This flag may be removed in the upcoming releases.
135 **** /meta/
136 A hash of arbitary keys and values which are *not* treated by
137 server in any way. These may be used by a client for
138 field-specific behaviour or templating.
375531a4 »
2012-03-01 Rehaul model fields description, add index field for metamodel (unused)
139
449b2cc9 »
2012-03-29 Rewrite README
140 ***** Suggested meta annotations
141 ****** default
142 Specifies the default value of field. (Will possibly move out
143 of meta if server will enforce default values upon creation
144 some day).
145
146 ****** dictionaryName
147 When field type is `dictionary`, `dictionaryName` key must be
148 present in field description as well. Client should provide
149 certain mapping between stored field contents and displayed
150 value using the name of dictionary.
151
152 ****** invisible
153 Boolean field to indicate that field should not be rendered on
154 UI (or not handled by client at all).
155 ****** label
156 Human-readable field label.
157 ****** readonly
158 Boolean field to indicate that client must render field as
159 disabled.
160 ****** requried
161 Boolean field to indicate that field is required. Client may
162 provide custom checks in UI for such fields. (Will possibly
163 move out of meta)
164
165 *** Sample form definition
166 (As described in [[http://scp-wiki.wikidot.com/][The SCP Foundation]] archives)
167
168 #+BEGIN_SRC javascript
169 {
170 "name": "SCP",
171 "canCreate": ["front"],
172 "canRead": true,
173 "canUpdate": ["front", "back", "manager"],
174 "canDelete": ["manager"]
175 "fields": [
176 {
177 "name": "code",
178 "meta": {
179 "label": "Code"
180 },
181 "canWrite": ["front", "back"]
182 },
183 {
184 "name": "title",
185 "meta": {
186 "label": "Title"
187 },
188 "canWrite": ["front", "back"]
189 },
190 {
191 "name": "foundAt",
192 "meta": {
193 "label": "Original location"
194 },
195 "canWrite": ["front", "back"]
196 },
197 {
198 "name": "dangerClass",
199 "meta": {
200 "label": "Danger class",
201 "dictionaryName": "DangerClasses",
202 "default": "lev0"
203 },
204 "type": "dictionary",
205 "canRead": ["front"]
206 "canWrite": ["back"]
207 },
208 {
209 "name": "conditions",
210 "meta": {
211 "label": "Special Containment Procedures"
212 },
213 "type": "textarea",
214 "canWrite": ["back"]
215 },
216 {
217 "name": "description",
218 "type": "textarea",
219 "meta": {
220 "label": "Description"
221 },
222 "canWrite": ["back"]
223 }
224 ]
225 }
226
227 #+END_SRC
228
229 *** Group fields
230 A group of fields (complex field) with distinctive name may be
231 shared across several models. Valid complex fields must be
232 defined in a file set by `field-groups-file` setting
233 ("resources/field-groups.json"), which must contain a JSON hash
234 where keys are group names and values are fields in respective
235 group.
aae4745b »
2012-03-15 Group fields draft
236
449b2cc9 »
2012-03-29 Rewrite README
237 #+BEGIN_SRC javascript
238 {
239 "address": [
240 {
241 "name": "city",
242 "meta": {
243 "label": "City"
244 }
245 },
246 {
247 "name": "zip",
248 "meta": {
249 "label": "ZIP / Postal code"
250 }
251 },
252 {
253 "name": "address",
254 "meta": {
255 "label": "Address"
256 },
257 "type": "textarea"
258 }
259 ]
260 }
261
262 #+END_SRC
aae4745b »
2012-03-15 Group fields draft
263
449b2cc9 »
2012-03-29 Rewrite README
264 Using `groupName` in field description is not allowed (no
265 recursive complex fields).
266
2df9ca81 »
2012-02-26 Describe permissions system
267 *** Permissions
268
3075e70e »
2012-02-26 Whole-form permissions now fully map to C-R-U-D
269 Per-field permissions (set in canRead and canWrite field
270 properties) are checked prior to writing any data to Redis or
e642418a »
2012-03-04 Fix transparent-mode notes
271 sending response to client (unless `transparent-mode` is `true`).
272 Implementation currently follows these rules:
2df9ca81 »
2012-02-26 Describe permissions system
273
274 - No unreadable fields are sent to client on READ methods;
275 - Attempt to perform any operation without being logged in results
276 in 401 Unauthorized error.
1dcf2649 »
2012-02-26 Metamodel → model; model with data → instance
277 - Attempt to perform any operation on unknown model results in
2df9ca81 »
2012-02-26 Describe permissions system
278 404 Not Found error;
279 - Attempt to create or update instances with unwritable fields
280 will be rejected with 403 Forbidden.
281
f29e16de »
2012-03-29 Field applications
282 *** Field applications
283 It's possible to change certain annotations for many fields in
284 model with one instruction. `application` key of form definition
285 contains a list of application objects. Every application object
286 may contain `canRead`, `canWrite` and `meta` keys with same syntax
287 as in fields. Additionally, `targets` keys must be present. If
288 `targets` is a list of field names, then new values for `canRead`,
289 `canWrite` are set for matched fields. `true` value of `targets`
290 matches every field. `meta` values from application and matched
291 field are merged, with meta keys from application having
292 precedence over field meta.
293
294 Example (set new label and foo meta, new permissions for all fields):
295 #+BEGIN_SRC javascript
296 {
297 "targets": true,
298 "meta": {
299 "label": "Renamed label",
300 "foo": "bar"
301 },
302 "canRead": ["changed_role"],
303 "canWrite": false
304 }
305 #+END_SRC
306
307 Example (change label of "foo" field):
308 #+BEGIN_SRC javascript
309 {
310 "targets": ["foo"],
311 "meta": {
312 "label": "Foo field"
313 }
314 }
315 #+END_SRC
aae4745b »
2012-03-15 Group fields draft
316 *** Served models
317 Client may request stripped form description by sending this
318 request:
2df9ca81 »
2012-02-26 Describe permissions system
319
449b2cc9 »
2012-03-29 Rewrite README
320 : GET /<modelname>/model/
321
322 Server takes several steps to serve the model.
323
324 **** Permissions processing
325 Response will contain original description but without fields
326 unreadable by current user. canEdit field property will be set to
327 boolean value for every form field, indicating whether the current
328 user can write to this field. Whole-form permissions will be set to
329 booleans as well, indicating whether the current user has specific
330 permissions.
331
332 **** Meta bags
333 `meta` for every field as served as-is without any changes.
334
335 **** Group splicing
336
337 Every field `f` with `groupName` annotation is spliced into list
338 of actual group members in served model, and `groupName` property
339 is attached to every field in splice result, with value equal to
340 name of group. Name of every field in group is *prepended* with
341 `f_`, where `f` is the name of original field which was spliced
342 into group. Client may use this data to recognize fields from the
343 same group and render them specifically.
344
345 /Example/:
2df9ca81 »
2012-02-26 Describe permissions system
346
449b2cc9 »
2012-03-29 Rewrite README
347 Assuming group `bar` has fields named `f1`, `f2` and `f3`, and
348 model has field with group splice annotation:
869be745 »
2012-02-27 Serve list of readable models from /_models
349
449b2cc9 »
2012-03-29 Rewrite README
350 #+BEGIN_SRC javascript
351 "name": "foo",
352 "groupName": "bar"
353 #+END_SRC
87b9c1c6 »
2012-03-22 Support arbitary annotations for fields.
354
449b2cc9 »
2012-03-29 Rewrite README
355 then `foo` will be *spliced into* fields named `foo_f1`, `foo_f2`
356 and `foo_f3`, and `groupName` for all these fields will be set to
357 `bar`.
f29e16de »
2012-03-29 Field applications
358 **** Applications
359 Applications are performed (in sequence following the order
360 they're listed in model definition) *after* group splicing, which
361 means applications may be used to override default field
362 annotations set for group members in `field-groups-file`.
449b2cc9 »
2012-03-29 Rewrite README
363 **** Index fields list caching
eca16ddf »
2012-03-22 Rename fields upon splicing (fix the group fields name clash issue)
364
449b2cc9 »
2012-03-29 Rewrite README
365 Served form will also contain `indices` field which is a list of
366 index fields of model.
eca16ddf »
2012-03-22 Rename fields upon splicing (fix the group fields name clash issue)
367
449b2cc9 »
2012-03-29 Rewrite README
368 **** Readable models
369 Client may also request list of readable models from
eca16ddf »
2012-03-22 Rename fields upon splicing (fix the group fields name clash issue)
370
449b2cc9 »
2012-03-29 Rewrite README
371 : GET /_models/
372
373 ** CRUD
374 We implement generic CRUD for our forms using Redson snaplet, which
375 is best explained by its routes (assuming they're installed in
376 top-level snaplet under `/_` URL; prefix may be changed using
377 nestSnaplet in parent initializer).
eca16ddf »
2012-03-22 Rename fields upon splicing (fix the group fields name clash issue)
378
449b2cc9 »
2012-03-29 Rewrite README
379 All interactions with server use JSON objects as primary format.
380 JSON objects are mapped to Redis hashes stored under
381 `<modelname>:<id>` key. Fresh id's are provided by using
382 `global:<modelname>:<id>` key which is INCR-ed after every new form
383 instance is created in database.
384
385 No schema checking is performed by server, but permissions engine
386 will disallow writing arbitary models and fields to server.
387
388 CRUD mapping to HTTP methods is implemented in Redson as expected
389 by Backbone:
869be745 »
2012-02-27 Serve list of readable models from /_models
390
449b2cc9 »
2012-03-29 Rewrite README
391 : CREATE → POST /<modelname>
392 : READ → GET /<modelname>/<instanceid>/
393 : UPDATE → PUT /<modelname>/<instanceid>/
394 : DELETE → DELETE /<modelname>/<instanceid>/
395
396 Redson snaplet is parametrized by AuthManager snaplet lens (usually
397 from top-level application). All methods implemented by Redson
398 require user to be logged in, 401 Unauthorized HTTP error response
399 is issued otherwise.
aae4745b »
2012-03-15 Group fields draft
400
4b35750c »
2012-02-18 README added
401 *** Server interface by example
402
1dcf2649 »
2012-02-26 Metamodel → model; model with data → instance
403 Assume we're using `scp.js` model given above.
4b35750c »
2012-02-18 README added
404
405 **** CREATE
406
407 Server request:
408
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
409 : curl localhost:8000/_/scp/ -X POST -d "{\"title\":\"Able\", \"code\":\"076\", \"class\":\"Keter\"}"
4b35750c »
2012-02-18 README added
410
411 What server did in Redis:
412
413 : incr global:scp:id
414
415 (24 is returned)
416
417 : hmset scp:24 code 076 title Able class Keter
418
419 Server response:
420
421 : {"code":"076","id":"24","title":"Able","class":"Keter"}
422
423 (note the `id` field which is returned by server after Redis was
424 updated with new form instance. Backbone stores new instance id
425 upon receiving server response and uses it in further server
426 requests for saving updated model instance)
427
428 **** READ
429
430 Server request:
431
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
432 : curl localhost:8000/_/scp/24/ -X GET
4b35750c »
2012-02-18 README added
433
434 Server response:
435
436 : {"code":"076","title":"Able","class":"Keter"}
437
438 Redis command used:
439
440 : hgetall scp:24
441
442 **** UPDATE
443
444 What is sent to server:
445
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
446 : curl localhost:8000/_/scp/24/ -X PUT -d "{\"title\":\"Able\", \"code\":\"076-2\", \"class\":\"Keter\", \"description\":\"Really nasty thing\"}"
4b35750c »
2012-02-18 README added
447
448 Server response is 204 (success, No content) in case the instance
449 previously existed and 404 if not.
450
451 Note that the all model fields are sent to server (this may be
452 improved for efficiency).
453
454 **** DELETE
455
456 Server request:
457
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
458 : curl localhost:8000/_/scp/24/ -X DELETE
4b35750c »
2012-02-18 README added
459
460 Redis deletes the key:
461
462 : del scp:24
463
464 Server response contains JSON of instance before deletion:
465
466 : {"code":"076-2","title":"Able","description":"Really nasty thing","class":"Keter"}
467
b61aaecd »
2012-03-05 Describe search interface
468 ** Search
469 Search interface for model <modelname> is available under
449b2cc9 »
2012-03-29 Rewrite README
470 `/_/<modelname>/search` access point via GET method. canRead form
471 permission is required to search for instances.
b61aaecd »
2012-03-05 Describe search interface
472
473 Accepted parameters are:
474
475 - key-value pairs where keys are index fields of model and values
476 are search terms;
477
478 - _limit parameter which sets maximum number of items served;
479
480 - _matchType=p or _matchType=s for prefix search or substring
481 search of value in index field (prefix search is faster);
482
483 - _searchType=and or _searchType=or which indicates if all search
484 terms must match or just any of them.
485
75de273e »
2012-03-22 Serve only a subset of fields in search results (_fields annotation)
486 - _fields=f1,f2,f3 which is a list of fields which must be
487 extracted from every matched instance and served in response.
488
489 Response is a list of JSON objects for matched instances. If
490 _fields is provided, then response is a list of arrays instead,
491 where every array contains values of specified fields in instance
b5e822bf »
2012-03-22 Serve null instead of empty string
492 (in order given by _fields parameter; if value is not present
493 then null is used).
75de273e »
2012-03-22 Serve only a subset of fields in search results (_fields annotation)
494
b61aaecd »
2012-03-05 Describe search interface
495 No per-field read permissions are checked.
449b2cc9 »
2012-03-29 Rewrite README
496
497 Currently search is implemented using slow `keys` Redis command,
498 and should be considered an ad-hoc solution only.
b3755170 »
2012-03-03 security-checking option added; README fixes
499 ** Extra features
4b35750c »
2012-02-18 README added
500 *** Timeline
501
1dcf2649 »
2012-02-26 Metamodel → model; model with data → instance
502 There's an extra entity stored in Redis for every model called
4b35750c »
2012-02-18 README added
503 timeline, which is a list with id's of instances stored in DB
504 (in order of creation).
505
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
506 `/_/scp/timeline/` serves JSON list of last N (currently 10)
1dcf2649 »
2012-02-26 Metamodel → model; model with data → instance
507 timeline items for model "scp":
4b35750c »
2012-02-18 README added
508
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
509 : curl localhost:8000/_/scp/timeline/ -X GET
4b35750c »
2012-02-18 README added
510 : ["39","38","37","36","35","34","33","32","31","30"]
511
512 If instance is removed from Redis, corresponding timeline entry is
513 removed as well.
514
515 Client front-end uses timeline to show links to fresh instances.
8cafd037 »
2012-02-26 Respect permissions in timeline handler
516
517 canRead model permission is required to access model timeline.
b3755170 »
2012-03-03 security-checking option added; README fixes
518
4b35750c »
2012-02-18 README added
519 *** WebSockets notifications
520
7c782873 »
2012-02-21 Change examples from `/rs` URL namespace to `/_`
521 `/_/<modelname>/events/` provides instance creation/deletion
4b35750c »
2012-02-18 README added
522 notifications through WebSockets interface. Events are transmitted
523 to clients in JSON format with fields `event`, `model` and `id`,
b3755170 »
2012-03-03 security-checking option added; README fixes
524 where `event` is either `create` or `delete`. No permissions are
525 checked currently when accessing events.
4b35750c »
2012-02-18 README added
526
449b2cc9 »
2012-03-29 Rewrite README
527 ** Snapless operation
528 The package provides Snap.Snaplet.Redson.Snapless.* modules:
529
530 - CRUD — low-level operation with Redis DB (on commit level, where
531 commit is a list of key-value pairs for named hash); operations
532 support index updates so use this for tools which need to fiddle
533 with Redson indices;
534
535 - Metamodel — model definition parsing;
536
537 - Loader — load models from filesystem locations, splicing groups;
538 served models are provided using this module.
4b35750c »
2012-02-18 README added
539 ** Redis interface
540 We use redis bindings provided by snaplet-redis package. Pool size
541 numbers are yet to be tuned.
542
b3755170 »
2012-03-03 security-checking option added; README fixes
543 * Setup
544 Following config options are recognized by Redson:
545
546 - models-directory ("resources/models"): directory which contains
547 model definitions to be read by Redson.
aae4745b »
2012-03-15 Group fields draft
548
549 - field-groups-file ("resources/field-groups.json"): file which
550 contains descriptions of usable complex field groups.
b3755170 »
2012-03-03 security-checking option added; README fixes
551
83309e79 »
2012-03-03 Rename secure to transparent
552 - transparent-mode (false): when true, no permissions checking is
b3755170 »
2012-03-03 security-checking option added; README fixes
553 performed. Redson acts in «transparent mode» allowing to store and
83309e79 »
2012-03-03 Rename secure to transparent
554 retrieve any JSON data. Any model may be written to.
4b35750c »
2012-02-18 README added
555 * To do
fcd52620 »
2012-03-03 Slot syntax draft, cache TODO
556 ** TODO [#A] Cache user permissions
24e3078f »
2012-03-11 Split Metamodel and Permissions modules. Now we have Snapless part
557 Snap.Snaplet.Redson.Snapless.Metamodel coupled with withCheckSecurity
fcd52620 »
2012-03-03 Slot syntax draft, cache TODO
558 provides permissions checking upon every CRUD operation.
559 Intersecting user roles and role lists set in form/field
560 permissions should be performed once when first request from that
561 user is received and cached for all further requests (models can't
562 be changed without Redson restart anyways, and restart will be
563 required when new users are added as well).
564
75de273e »
2012-03-22 Serve only a subset of fields in search results (_fields annotation)
565 ** TODO External search providers
566 Might subscribe to model events via socket. Provides lists of
567 matching instance ids.
a3cfff2f »
2012-03-06 TODO
568 ** MAYBE Update inverse references
569 When instance of model becomes referenced by another instance,
570 inverse reference should be updated by server.
859204a7 »
2012-03-06 Orphan todo
571
24a7088a »
2012-03-08 Describe dictionary
572 We already have indices out of the box so we can get this feature
573 for free.
574
859204a7 »
2012-03-06 Orphan todo
575 Perhaps orphan dependent models should be cleared if parent is
576 deleted.
24a7088a »
2012-03-08 Describe dictionary
577 ** SOMEDAY Factor out Snap.Snaplet.Redson.Util to snap-errors module
24e3078f »
2012-03-11 Split Metamodel and Permissions modules. Now we have Snapless part
578 ** MAYBE Force default values when creating instance
4b35750c »
2012-02-18 README added
579 ** TODO Configurable pool size
580
581 ** TODO WebSockets interface improvement
582 - [X] `load-model.js` contains full URI to WebSockets entry point
1dcf2649 »
2012-02-26 Metamodel → model; model with data → instance
583 (currently hardcoded for `scp` model)
4b35750c »
2012-02-18 README added
584 - [ ] publish events only for respective model under
585 `<model>/events` entry point (requires addressing extension for
449b2cc9 »
2012-03-29 Rewrite README
586 PubSub or multiple PubSubs; non-transparent mode only +
587 BigBrother role for «all models» event entry point)
588 - [ ] check permissions (if we want to serve associated commits in
589 event messages, per-model canRead may be not enough (what if
590 listener has no access to certain fields and we can't strip
591 commit for every listener personally))
24e3078f »
2012-03-11 Split Metamodel and Permissions modules. Now we have Snapless part
592 - [ ] possibly use native Redis' publish/subscribe mechanism
77513989 »
2012-03-29 Search TODO
593 ** TODO Support search in transparent mode
594 Currently only index fields of model are searched against, which
595 means that model definition must be available for searching (this
596 also required redundant `name` field in form definition), while in
597 fact redisSearch can be implemented using ModelName only. External
598 providers must support name-only operation as well.
Something went wrong with that request. Please try again.