Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jio-main
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Hardik Juneja
jio-main
Commits
ea446b38
Commit
ea446b38
authored
Dec 21, 2012
by
Sven Franck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
localstorage dumb post
parent
b008e2eb
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
304 additions
and
617 deletions
+304
-617
src/jio.dummystorages.js
src/jio.dummystorages.js
+10
-0
src/jio.storage/localstorage.js
src/jio.storage/localstorage.js
+99
-479
src/jio/commands/command.js
src/jio/commands/command.js
+4
-2
src/jio/commands/putAttachmentCommand.js
src/jio/commands/putAttachmentCommand.js
+2
-1
src/jio/jio.outro.js
src/jio/jio.outro.js
+5
-0
test/jiotests.js
test/jiotests.js
+184
-135
No files found.
src/jio.dummystorages.js
View file @
ea446b38
...
...
@@ -73,6 +73,16 @@
},
100
);
// 100 ms, for jiotests simple job waiting
};
// end put
that
.
putAttachment
=
function
(
command
)
{
setTimeout
(
function
()
{
that
.
success
({
ok
:
true
,
id
:
command
.
getDocId
(),
rev
:
generateRevision
(
command
,
"
putAttachment
"
,
true
)
});
},
100
);
// 100 ms, for jiotests simple job waiting
};
// end put
that
.
get
=
function
(
command
)
{
setTimeout
(
function
()
{
that
.
success
({
...
...
src/jio.storage/localstorage.js
View file @
ea446b38
/**
* JIO Local Storage. Type = 'local'.
*
It is a database located in the browser local
storage.
*
Local browser "database"
storage.
*/
var
newLocalStorage
=
function
(
spec
,
my
)
{
spec
=
spec
||
{};
var
that
=
my
.
basicStorage
(
spec
,
my
),
priv
=
{};
var
newLocalStorage
=
function
(
spec
,
my
)
{
/*
* Wrapper for the localStorage used to simplify instion of any kind of
* values
*/
var
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
item
));
},
setItem
:
function
(
item
,
value
)
{
return
localStorage
.
setItem
(
item
,
JSON
.
stringify
(
value
));
spec
=
spec
||
{};
var
that
=
my
.
basicStorage
(
spec
,
my
),
priv
=
{},
/*
* Wrapper for the localStorage used to simplify instion of any kind of
* values
*/
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
item
));
},
setItem
:
function
(
item
,
value
)
{
return
localStorage
.
setItem
(
item
,
JSON
.
stringify
(
value
));
},
deleteItem
:
function
(
item
)
{
delete
localStorage
[
item
];
}
},
deleteItem
:
function
(
item
)
{
delete
localStorage
[
item
];
}
};
storage_user_array_name
,
storage_file_array_name
;
// attributes
priv
.
username
=
spec
.
username
||
''
;
priv
.
secured_username
=
utilities
.
secureString
(
priv
.
username
);
priv
.
applicationname
=
spec
.
applicationname
||
'
untitled
'
;
priv
.
secured_applicationname
=
utilities
.
secureString
(
priv
.
applicationname
);
var
storage_user_array_name
=
'
jio/local_user_array
'
;
var
storage_file_array_name
=
'
jio/local_file_name_array/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
;
// Overriding serialized()
var
super_serialized
=
that
.
serialized
;
that
.
serialized
=
function
()
{
var
o
=
super_serialized
();
o
.
applicationname
=
priv
.
applicationname
;
o
.
username
=
priv
.
username
;
return
o
;
};
// Overrinding validateState()
that
.
validateState
=
function
()
{
if
(
priv
.
secured_username
)
{
return
''
;
}
return
'
Need at least one parameter: "username".
'
;
};
storage_user_array_name
=
'
jio/local_user_array
'
;
storage_file_array_name
=
'
jio/local_file_name_array/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
;
/**
* Returns a list of users.
...
...
@@ -65,7 +51,7 @@ var newLocalStorage = function ( spec, my ) {
priv
.
addUser
=
function
(
user_name
)
{
var
user_array
=
priv
.
getUserArray
();
user_array
.
push
(
user_name
);
localstorage
.
setItem
(
storage_user_array_name
,
user_array
);
localstorage
.
setItem
(
storage_user_array_name
,
user_array
);
};
/**
...
...
@@ -101,7 +87,7 @@ var newLocalStorage = function ( spec, my ) {
priv
.
addFileName
=
function
(
file_name
)
{
var
file_name_array
=
priv
.
getFileNameArray
();
file_name_array
.
push
(
file_name
);
localstorage
.
setItem
(
storage_file_array_name
,
file_name_array
);
localstorage
.
setItem
(
storage_file_array_name
,
file_name_array
);
};
/**
...
...
@@ -116,7 +102,7 @@ var newLocalStorage = function ( spec, my ) {
new_array
.
push
(
array
[
i
]);
}
}
localstorage
.
setItem
(
storage_file_array_name
,
new_array
);
localstorage
.
setItem
(
storage_file_array_name
,
new_array
);
};
/**
...
...
@@ -135,7 +121,7 @@ var newLocalStorage = function ( spec, my ) {
obj
.
revs_info
=
doc
.
_revs_info
;
}
if
(
command
.
getOption
(
'
conflicts
'
))
{
obj
.
conflicts
=
{
total_rows
:
0
,
rows
:[]};
obj
.
conflicts
=
{
total_rows
:
0
,
rows
:[]};
}
return
obj
;
};
...
...
@@ -165,101 +151,54 @@ var newLocalStorage = function ( spec, my ) {
};
/**
* runDocumentUpdate - run the whole update process for localstorage
* @param {object} doc - the original document object.
* @param {object} docTree - the document tree
* @param {object} command - command object
* @param {string} docId - document id
* @param {string} attachmentId - attachmentId
* @param {string} docPath - document paths
* @param {string} prev_rev- previous revision
* @param {string} treePath- document tree paths
* @param {boolean} sync - whether this is an update or sync operation!
* @returns {object} success- success object
* Create a new document
* @param {object} command Command object
*/
priv
.
runDocumentUpdate
=
function
(
doc
,
docTree
,
command
,
docId
,
attachmentId
,
docPath
,
prev_rev
,
treePath
,
sync
){
var
docPathRev
,
newRevision
,
revs_info
,
deletedLeaf
;
// update ...I don't know what this is doing?
priv
.
documentObjectUpdate
(
doc
,
command
.
cloneDoc
());
// update document - not when put sync-ing
if
(
sync
===
false
){
// create a new revision
doc
=
utilities
.
updateDocument
(
doc
,
docPath
,
prev_rev
,
attachmentId
);
docPathRev
=
docPath
+
'
/
'
+
doc
.
_rev
;
newRevision
=
doc
.
_rev
;
revs_info
=
undefined
;
// delete old doc (.../DOCID/old_REVISION)
localstorage
.
deleteItem
(
docPath
+
'
/
'
+
prev_rev
);
}
else
{
docPathRev
=
docPath
+
'
/
'
+
doc
.
_revs_info
[
0
].
rev
;
newRevision
=
null
;
revs_info
=
doc
.
_revs_info
;
if
(
revs_info
[
0
].
status
===
'
deleted
'
){
deletedLeaf
=
true
;
}
}
if
(
deletedLeaf
===
undefined
){
// store new doc (.../DOCID/new_REVISION)
localstorage
.
setItem
(
docPathRev
,
doc
);
}
priv
.
runDocumenCreate
=
function
(
docid
,
command
){
// update tree and store
localstorage
.
setItem
(
treePath
,
utilities
.
updateDocumentTree
(
docTree
,
prev_rev
,
newRevision
,
revs_info
,
deletedLeaf
)
);
// return SUCCESS
return
priv
.
manageOptions
({
ok
:
true
,
id
:
docId
,
rev
:
doc
.
_rev
},
command
,
doc
);
};
/**
* runDocumentCreate - run the whole create process for localstorage
* @param {string} docId - document id
* @param {object} command - command object
* @returns {object} success- success object
*/
priv
.
runDocumenCreate
=
function
(
docId
,
command
){
// create new document and tree
var
docPath
=
'
jio/local/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
+
'
/
'
+
docId
,
doc
=
utilities
.
createDocument
(
docId
,
docPath
),
tree
=
utilities
.
createDocumentTree
(
doc
),
treePath
=
docPath
+
'
/revision_tree
'
;
var
docId
=
command
.
getDocId
(),
docPath
=
'
jio/local/
'
+
priv
.
username
+
'
/
'
+
priv
.
applicationname
+
'
/
'
+
docId
,
doc
=
priv
.
createDocument
(
docId
,
docPath
);
// store document
localstorage
.
setItem
(
docPath
+
'
/
'
+
doc
.
_rev
,
doc
);
// store tree
localstorage
.
setItem
(
treePath
,
tree
);
// add user
if
(
!
priv
.
doesUserExist
(
priv
.
secured_
username
))
{
priv
.
addUser
(
priv
.
secured_
username
);
if
(
!
priv
.
doesUserExist
(
priv
.
username
))
{
priv
.
addUser
(
priv
.
username
);
}
// add fileName
priv
.
addFileName
(
docId
);
// return SUCCESS
return
priv
.
manageOptions
({
ok
:
true
,
id
:
docId
,
rev
:
doc
.
_rev
},
command
,
doc
);
return
priv
.
manageOptions
(
{
ok
:
true
,
id
:
docId
,
rev
:
doc
.
_rev
},
command
,
doc
);
};
// =============================== METHODS =
=====================
// ================== storage overrides
=====================
// Overriding serialized()
var
super_serialized
=
that
.
serialized
;
that
.
serialized
=
function
()
{
var
o
=
super_serialized
();
o
.
applicationname
=
priv
.
applicationname
;
o
.
username
=
priv
.
username
;
return
o
;
};
// Overrinding validateState()
that
.
validateState
=
function
()
{
if
(
priv
.
username
)
{
return
''
;
}
return
'
Need at least one parameter: "username".
'
;
};
// Overriding storage post
/**
* @method post - Create a document in local storage.
* @method
_
post - Create a document in local storage.
* @stored - 'jio/local/USR/APP/FILE_NAME/REVISION'.
*
* Available options:
...
...
@@ -268,36 +207,26 @@ var newLocalStorage = function ( spec, my ) {
* - {boolean} revs_info - Add revisions informations
*
*/
that
.
post
=
function
(
command
)
{
that
.
_
post
=
function
(
command
)
{
setTimeout
(
function
()
{
var
docId
=
command
.
getDocId
(),
reg
=
utilities
.
isUUID
(
docId
);
// 403 - no attachments allowed
if
(
command
.
getAttachmentId
())
{
that
.
error
(
utilities
.
throwError
(
403
,
that
.
error
(
that
.
createErrorObject
(
403
,
'
Forbidden
'
,
'
Attachment cannot be added with a POST request
'
)
);
return
;
}
// 403 id was supplied, use PUT
if
(
reg
!==
true
)
{
that
.
error
(
utilities
.
throwError
(
403
,
'
ID cannot be supplied with a POST request. Please use PUT
'
)
);
return
;
// ok
}
else
{
that
.
success
(
priv
.
runDocumenCreate
(
docId
,
command
)
priv
.
runDocumenCreate
(
command
)
);
}
});
};
// Overriding storage put
/**
* @method put - Create or Update a document in local storage.
* @stored - 'jio/local/USR/APP/FILE_NAME/REVISION'.
...
...
@@ -307,383 +236,74 @@ var newLocalStorage = function ( spec, my ) {
* - {boolean} revs - Add the revisions history of the document
* - {boolean} revs_info - Add revisions informations
*/
that
.
put
=
function
(
command
)
{
that
.
_
put
=
function
(
command
)
{
setTimeout
(
function
()
{
var
docId
=
command
.
getDocId
(),
prev_rev
=
command
.
getDocInfo
(
'
_rev
'
),
docPath
=
'
jio/local/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
+
'
/
'
+
docId
,
treePath
=
docPath
+
'
/revision_tree
'
,
docTree
=
localstorage
.
getItem
(
treePath
),
doc
,
docPathRev
,
activeLeaves
,
reg
=
utilities
.
isUUID
(
docId
);
// no tree = create document or error
if
(
!
docTree
)
{
// 404 id/revision provided = update, incorrect revision
if
(
prev_rev
!==
undefined
&&
reg
===
false
){
that
.
error
(
utilities
.
throwError
(
404
,
'
Document not found, please check revision and/or ID
'
)
);
return
;
}
// 409 no revision and UUID = create, no id provided
if
(
prev_rev
===
undefined
&&
reg
===
true
){
that
.
error
(
utilities
.
throwError
(
409
,
'
Missing Document ID and or Revision
'
)
);
return
;
}
// if passed here, we create.
// it could be create (id+content) or update (sans revision)
// but since no tree was found we end here with a NEW id only
// (otherwise tree would be have been found).
that
.
success
(
priv
.
runDocumenCreate
(
docId
,
command
)
);
}
else
{
// found a tree
activeLeaves
=
utilities
.
getActiveLeaves
(
docTree
);
// check if revision is on doc-tree and if it is an active leaf
if
(
!
utilities
.
isInObject
(
prev_rev
,
activeLeaves
)
)
{
// check if it's a dead leaf (wrong revision)
if
(
utilities
.
isDeadLeaf
(
prev_rev
,
docTree
)
){
// 409 deleted leaf/branch = wrong revision
that
.
error
(
utilities
.
throwError
(
409
,
'
Revision supplied is not the latest revision
'
)
);
return
;
}
// maybe a sync-PUT from another storage, we must
// have revs_info option, otherwise we cannot know
// where to put the file and update the storage tree
if
(
!
utilities
.
isDeadLeaf
(
prev_rev
,
docTree
)
&&
command
.
getDocInfo
(
'
_revs_info
'
)
===
undefined
){
// 409 no revs_info provided
that
.
error
(
utilities
.
throwError
(
409
,
'
Missing revs_info required for sync-put
'
)
);
return
;
}
else
{
// SYNC PUT
// revs_info is provided, this is a new version
// store this document and merge
// NOTE: we also have to SYNC PUT deleted versions
// otherwise the tree will not be the same AND
// other storages will not know which versions of a
// document have been deleted!!!!
// get the new document
doc
=
command
.
getDoc
();
// ok
that
.
success
(
priv
.
runDocumentUpdate
(
doc
,
docTree
,
command
,
docId
,
undefined
,
docPath
,
prev_rev
,
treePath
,
true
)
);
}
}
else
{
// revision matches a currently active leaf
// = update of an existing document version
// get doc
docPathRev
=
docPath
+
'
/
'
+
prev_rev
;
doc
=
localstorage
.
getItem
(
docPathRev
);
if
(
!
doc
){
// 404 document not available, should not happen!
that
.
error
(
utilities
.
throwError
(
404
,
'
Referenced document not found
'
)
);
return
;
}
else
{
// ok
that
.
success
(
priv
.
runDocumentUpdate
(
doc
,
docTree
,
command
,
docId
,
undefined
,
docPath
,
prev_rev
,
treePath
,
false
)
);
}
}
}
});
};
// Overriding storage putAttachment
/**
* @method putAttachment - Saves/updates an attachment of a document
* @stored at - 'jio/local/USR/APP/FILE_NAME/REVISION/ATTACHMENTID'.
* @stored at - 'jio/local/USR/APP/FILE_NAME/REVISION/ATTACHMENTID'.
*
* Available options:
* - {boolean} conflicts - Add a conflicts object to the response
* - {boolean} revs - Add the revisions history of the document
* - {boolean} revs_info - Add revisions informations
*/
that
.
putAttachment
=
function
(
command
)
{
setTimeout
(
function
()
{
var
docId
=
command
.
getDocId
(),
docPath
=
'
jio/local/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
+
'
/
'
+
docId
,
prev_rev
=
command
.
getDocInfo
(
'
_rev
'
),
treePath
=
docPath
+
'
/revision_tree
'
,
docTree
=
localstorage
.
getItem
(
treePath
),
doc
,
docPathRev
,
activeLeaves
,
attachmentId
,
attachment
,
attachmentPath
;
if
(
!
docTree
)
{
// 404 document wasn't found = wrong id or revision
that
.
error
(
utilities
.
throwError
(
404
,
'
Document not found, please check document ID
'
)
);
return
;
that
.
_putAttachment
=
function
(
command
)
{
setTimeout
(
function
()
{
}
else
{
// found a tree
activeLeaves
=
utilities
.
getActiveLeaves
(
docTree
);
// check if revision is on tree
if
(
utilities
.
isInObject
(
prev_rev
,
activeLeaves
)
)
{
// check if dead leaf
if
(
utilities
.
isDeadLeaf
(
prev_rev
,
docTree
)
){
// 409 deleted leaf/branch = wrong revision
that
.
error
(
utilities
.
throwError
(
409
,
'
Trying to update on a previous document version
'
)
);
return
;
}
else
{
// revision is ok
attachmentId
=
command
.
getAttachmentId
();
// 409 missing attachment id
if
(
!
attachmentId
){
that
.
error
(
utilities
.
throwError
(
409
,
'
No attachment id specified
'
)
);
return
;
}
else
{
// set attachment
attachmentPath
=
docPath
+
'
/
'
+
prev_rev
+
'
/
'
+
attachmentId
;
attachment
=
localstorage
.
getItem
(
attachmentPath
);
// store/update attachment
localstorage
.
setItem
(
attachmentPath
,
command
.
getContent
());
// get doc
docPathRev
=
docPath
+
'
/
'
+
prev_rev
;
doc
=
localstorage
.
getItem
(
docPathRev
);
// ok
that
.
success
(
priv
.
runDocumentUpdate
(
doc
,
docTree
,
command
,
docId
,
attachmentId
,
docPath
,
prev_rev
,
treePath
,
false
)
);
}
}
}
else
{
// 404 revision supplied is not on tree
that
.
error
(
utilities
.
throwError
(
404
,
'
Document not found, please check revision
'
)
);
return
;
}
}
});
};
// end putAttachment
};
// Overriding storage get
/**
* Loads a document from the local storage.
* It will load file in 'jio/local/USR/APP/FILE_NAME'.
* @method get
*/
that
.
get
=
function
(
command
)
{
setTimeout
(
function
()
{
var
docid
,
doc
,
docpath
,
attmtid
,
attmt
;
docid
=
command
.
getDocId
();
docpath
=
'
jio/local/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
+
'
/
'
+
docid
;
attmtid
=
command
.
getAttachmentId
();
if
(
attmtid
)
{
// this is an attachment
attmt
=
localstorage
.
getItem
(
docpath
+
'
/
'
+
attmtid
);
if
(
!
attmt
)
{
// there is no attachment to get
that
.
error
({
status
:
404
,
statusText
:
'
Not found
'
,
error
:
'
not_found
'
,
message
:
'
Document is missing attachment.
'
,
reason
:
'
document is missing attachment
'
});
return
;
}
// send the attachment content
that
.
success
(
attmt
);
}
else
{
// this is a document
doc
=
localstorage
.
getItem
(
docpath
);
if
(
!
doc
)
{
// the document does not exist
that
.
error
({
status
:
404
,
statusText
:
'
Not Found.
'
,
error
:
'
not_found
'
,
message
:
'
Document "
'
+
docid
+
'
" not found.
'
,
reason
:
'
missing
'
});
}
else
{
if
(
!
command
.
getDocInfo
(
'
revs
'
))
{
delete
doc
.
_revisions
;
}
if
(
!
command
.
getDocInfo
(
'
revs_info
'
))
{
delete
doc
.
_revs_info
;
}
if
(
command
.
getDocInfo
(
'
conflicts
'
))
{
doc
.
_conflicts
=
{
total_rows
:
0
,
rows
:[]};
}
that
.
success
(
doc
);
}
}
that
.
_get
=
function
(
command
)
{
setTimeout
(
function
()
{
});
};
// end get
};
// Overriding storage remove
/**
* Gets a document list from the local storage.
* It will retreive an array containing files meta data owned by
* the user.
* @method allDocs
* Removes a document or attachment from the local storage.
* It will also remove the path from the local file array.
* @method remove
*/
that
.
_remove
=
function
(
command
)
{
// ============== NOT MODIFIED YET ===============
that
.
allDocs
=
function
(
command
)
{
setTimeout
(
function
()
{
setTimeout
(
function
()
{
var
new_array
=
[],
array
=
[],
i
,
l
,
k
=
'
key
'
,
path
=
'
jio/local/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
,
file_object
=
{};
array
=
priv
.
getFileNameArray
();
for
(
i
=
0
,
l
=
array
.
length
;
i
<
l
;
i
+=
1
)
{
file_object
=
localstorage
.
getItem
(
path
+
'
/
'
+
array
[
i
]);
if
(
file_object
)
{
if
(
command
.
getOption
(
'
metadata_only
'
))
{
new_array
.
push
({
id
:
file_object
.
_id
,
key
:
file_object
.
_id
,
value
:{
_creation_date
:
file_object
.
_creation_date
,
_last_modified
:
file_object
.
_last_modified
}});
}
else
{
new_array
.
push
({
id
:
file_object
.
_id
,
key
:
file_object
.
_id
,
value
:{
content
:
file_object
.
content
,
_creation_date
:
file_object
.
_creation_date
,
_last_modified
:
file_object
.
_last_modified
}});
}
}
}
that
.
success
({
total_rows
:
new_array
.
length
,
rows
:
new_array
});
});
};
// end allDocs
};
// Overriding storage allDocs
/**
* Removes a document or attachment from the local storage.
* It will also remove the path from the local file array.
* @method remove
* Gets a document list from the local storage.
* It will retreive an array containing files meta data owned by
* the user.
* @method allDocs
*/
// ============== FILES WON'T BE DELETED YET ===============
that
.
remove
=
function
(
command
)
{
// wait a little in order to simulate asynchronous saving
that
.
allDocs
=
function
(
command
)
{
setTimeout
(
function
()
{
var
docid
,
doc
,
docpath
,
prev_rev
,
attmtid
,
attmt
,
attpath
;
docid
=
command
.
getDocId
(),
docpath
=
'
jio/local/
'
+
priv
.
secured_username
+
'
/
'
+
priv
.
secured_applicationname
+
'
/
'
+
docid
;
prev_rev
=
command
.
getDocInfo
(
'
_rev
'
);
attmtid
=
command
.
getAttachmentId
();
// xxx remove attachment if exists
if
(
attmtid
){
attpath
=
docpath
+
'
/
'
+
attmtid
;
attmt
=
localstorage
.
getItem
(
attpath
);
if
(
attmt
){
// deleting
localstorage
.
deleteItem
(
attpath
);
priv
.
removeFileName
(
attpath
);
// xxx add new revision to tree here
that
.
success
({
ok
:
true
,
id
:
command
.
getDocId
()});
}
else
{
// the document does not exist
that
.
error
({
status
:
404
,
statusText
:
'
Not Found.
'
,
error
:
'
not_found
'
,
message
:
'
Document "
'
+
docid
+
'
" not found.
'
,
reason
:
'
missing
'
});
}
// xxx remove document if exists
}
else
{
doc
=
localstorage
.
getItem
(
docpath
);
// document exists
if
(
doc
){
// check for wrong revision
if
(
doc
.
_rev
===
prev_rev
){
localstorage
.
deleteItem
(
docpath
);
priv
.
removeFileName
(
docid
);
// xxx add new revision to tree here
that
.
success
({
ok
:
true
,
id
:
command
.
getDocId
()});
}
else
{
// the document does not exist
that
.
error
({
status
:
409
,
statusText
:
'
Conflict
'
,
error
:
'
conflict
'
,
message
:
'
Document update conflict.
'
,
reason
:
'
Trying to update an outdated revision
'
});
}
}
else
{
// the document does not exist
that
.
error
({
status
:
404
,
statusText
:
'
Not Found.
'
,
error
:
'
not_found
'
,
message
:
'
Document "
'
+
docid
+
'
" not found.
'
,
reason
:
'
missing
'
});
}
}
});
};
// end remove
};
return
that
;
};
...
...
src/jio/commands/command.js
View file @
ea446b38
...
...
@@ -26,6 +26,10 @@ var command = function(spec, my) {
// xxx fixed spec.content to spec.doc.content for PUTATTACHMENT
// xxx need extra check for GET, otherwise spec.doc is undefined
console
.
log
(
"
COMMAND
"
);
console
.
log
(
spec
);
console
.
log
(
spec
.
doc
);
console
.
log
(
spec
.
doc
.
content
);
priv
.
content
=
spec
.
doc
===
undefined
?
undefined
:
typeof
spec
.
doc
.
content
===
'
string
'
?
spec
.
doc
.
content
:
...
...
@@ -80,8 +84,6 @@ var command = function(spec, my) {
* @return {object} the document.
*/
that
.
getDoc
=
function
()
{
console
.
log
(
"
where is my doc
"
);
console
.
log
(
priv
.
doc
);
return
priv
.
doc
;
};
...
...
src/jio/commands/putAttachmentCommand.js
View file @
ea446b38
...
...
@@ -11,7 +11,8 @@ var putAttachmentCommand = function(spec, my) {
that
.
executeOn
=
function
(
storage
)
{
storage
.
putAttachment
(
that
);
};
console
.
log
(
"
putAttachmentCommand
"
);
console
.
log
(
typeof
that
.
getContent
()
);
that
.
validateState
=
function
()
{
if
(
typeof
that
.
getContent
()
!==
'
string
'
)
{
that
.
error
({
...
...
src/jio/jio.outro.js
View file @
ea446b38
...
...
@@ -147,6 +147,11 @@
};
priv
.
parametersToObject
=
function
(
list
,
default_options
)
{
console
.
log
(
"
aloha
"
);
console
.
log
(
"
what do we have
"
);
console
.
log
(
list
);
console
.
log
(
default_options
);
var
k
,
i
=
0
,
callbacks
=
[],
param
=
{
options
:{}};
for
(
i
=
0
;
i
<
list
.
length
;
i
+=
1
)
{
if
(
typeof
list
[
i
]
===
'
object
'
)
{
...
...
test/jiotests.js
View file @
ea446b38
...
...
@@ -57,6 +57,7 @@ basic_test_function_generator = function(o,res,value,message) {
};
},
basic_spy_function
=
function
(
o
,
res
,
value
,
message
,
fun
)
{
fun
=
fun
||
'
f
'
;
o
[
fun
]
=
basic_test_function_generator
(
o
,
res
,
value
,
message
);
o
.
t
.
spy
(
o
,
fun
);
...
...
@@ -65,6 +66,7 @@ basic_tick_function = function (o) {
var
tick
,
fun
,
i
=
1
;
tick
=
1000
;
fun
=
fun
||
'
f
'
;
if
(
typeof
arguments
[
i
]
===
'
number
'
)
{
tick
=
arguments
[
i
];
i
++
;
}
...
...
@@ -663,41 +665,42 @@ test ('Post', function(){
o
.
spy
=
basic_spy_function
;
o
.
clean
=
clean_up_local_storage_function
();
o
.
username
=
'
MrPost
'
;
o
.
testBuildTree
=
[];
o
.
testRevisionStorage
=
[];
// let's go
o
.
jio
=
JIO
.
newJio
({
type
:
'
local
'
,
username
:
o
.
username
,
applicationname
:
'
jiotests
'
});
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
forbidden
'
,
"
message
"
:
'
Forbidden
'
,
"
reason
"
:
'
ID cannot be supplied with a POST request. Please use PUT
'
,
"
status
"
:
403
,
"
statusText
"
:
'
Forbidden
'
// ========================================
// 1) POST with id
o
.
jio
.
post
({
"
_id
"
:
'
file
'
,
"
content
"
:
'
content
'
},
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
forbidden
'
,
"
message
"
:
'
Forbidden
'
,
"
reason
"
:
'
ID cannot be supplied with a POST request. Please use PUT
'
,
"
status
"
:
403
,
"
statusText
"
:
'
Forbidden
'
},
'
POST with id = 403 forbidden
'
);
o
.
jio
.
post
({
"
_id
"
:
'
file
'
,
"
content
"
:
'
content
'
},
o
.
f
);
// TEST 1) POST with id
o
.
f
(
err
);
});
checkReply
(
o
,
null
,
true
);
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
forbidden
'
,
"
message
"
:
'
Forbidden
'
,
"
reason
"
:
'
Attachment cannot be added with a POST request
'
,
"
status
"
:
403
,
"
statusText
"
:
'
Forbidden
'
},
'
POST attachment = 403 forbidden
'
);
o
.
jio
.
post
({
"
_id
"
:
'
file/ABC
'
,
"
mimetype
"
:
'
text/html
'
,
"
content
"
:
'
<b>hello</b>
'
},
o
.
f
);
// TEST 2) POST attachment
o
.
clock
.
tick
(
base_tick
);
// ========================================
// 2) POST attachment
o
.
jio
.
post
({
"
_id
"
:
'
file/ABC
'
,
"
mimetype
"
:
'
text/html
'
,
"
content
"
:
'
<b>hello</b>
'
},
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
forbidden
'
,
"
message
"
:
'
Forbidden
'
,
"
reason
"
:
'
Attachment cannot be added with a POST request
'
,
"
status
"
:
403
,
"
statusText
"
:
'
Forbidden
'
},
'
POST attachment = 403 forbidden
'
);
o
.
f
(
err
);
});
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
// ========================================
// 3) POST content
o
.
jio
.
post
({
"
content
"
:
'
content
'
},
function
(
err
,
response
)
{
o
.
spy
(
o
,
'
value
'
,{
"
ok
"
:
true
,
"
id
"
:
response
.
id
,
"
rev
"
:
response
.
rev
},
...
...
@@ -712,13 +715,14 @@ test ('Post', function(){
o
.
buildTestTree
=
{
"
kids
"
:[],
"
rev
"
:
o
.
testRevisionStorage
[
0
],
"
status
"
:
'
available
'
,
"
type
"
:
'
leaf
'
};
//
TEST
4) check if document is created and correct
// 4) check if document is created and correct
checkFile
(
response
,
o
,
null
,
true
);
//
TEST
5) check if document tree is created and correct
// 5) check if document tree is created and correct
checkTreeNode
(
response
,
o
,
null
,
true
);
});
// 3) TEST POST content
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
// END POST
o
.
jio
.
stop
();
o
.
clean
;
});
...
...
@@ -755,7 +759,7 @@ test ('Put', function(){
fake_id_1
,
fake_id_2
,
o
=
{};
o
=
{};
o
.
t
=
this
;
o
.
clock
=
o
.
t
.
sandbox
.
useFakeTimers
();
o
.
falseRevision
;
...
...
@@ -775,69 +779,68 @@ test ('Put', function(){
o
.
spy
=
basic_spy_function
;
o
.
clean
=
clean_up_local_storage_function
();
o
.
username
=
'
MrPutt
'
;
o
.
testBuildTree
=
[];
o
.
testRevisionStorage
=
[];
// let's go
o
.
jio
=
JIO
.
newJio
({
type
:
'
local
'
,
username
:
o
.
username
,
applicationname
:
'
jiotests
'
});
// TEST 1) PUT without ID
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
conflict
'
,
"
message
"
:
'
Document update conflict.
'
,
"
reason
"
:
'
Missing Document ID and or Revision
'
,
"
status
"
:
409
,
"
statusText
"
:
'
Conflict
'
},
'
PUT without id = 409 Conflict
'
);
o
.
jio
.
put
({
"
content
"
:
'
content
'
},
o
.
f
);
// ========================================
// 1) PUT without ID
o
.
jio
.
put
({
"
content
"
:
'
content
'
},
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
conflict
'
,
"
message
"
:
'
Document update conflict.
'
,
"
reason
"
:
'
Missing Document ID and or Revision
'
,
"
status
"
:
409
,
"
statusText
"
:
'
Conflict
'
},
'
PUT without id = 409 Conflict
'
);
o
.
f
(
err
);
});
checkReply
(
o
,
null
,
true
);
// TEST 2) PUT wrong id/rev
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
not found
'
,
"
message
"
:
'
Document not found.
'
,
"
reason
"
:
'
Document not found, please check revision and/or ID
'
,
"
status
"
:
404
,
"
statusText
"
:
'
Not found
'
o
.
clock
.
tick
(
base_tick
);
// ========================================
// 2) PUT wrong id/rev
o
.
jio
.
put
({
"
content
"
:
'
content
'
,
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
'
1-ABCDEFG
'
},
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
not found
'
,
"
message
"
:
'
Document not found.
'
,
"
reason
"
:
'
Document not found, please check revision and/or ID
'
,
"
status
"
:
404
,
"
statusText
"
:
'
Not found
'
},
'
PUT with wrong id/revision = 404 Not found
'
);
o
.
jio
.
put
({
"
content
"
:
'
content
'
,
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
'
1-ABCDEFG
'
},
o
.
f
);
o
.
f
(
err
);
}
);
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
//
start adding
content
// ========================================
//
3) PUT
content
o
.
jio
.
put
({
"
content
"
:
'
content
'
,
"
_id
"
:
'
myDoc
'
},
function
(
err
,
response
)
{
o
.
spy
(
o
,
'
value
'
,{
"
ok
"
:
true
,
"
id
"
:
response
.
id
,
"
rev
"
:
response
.
rev
},
'
PUT content = ok
'
);
o
.
f
(
response
);
// store falseRevision
o
.
falseRevision
=
response
.
rev
;
// build tree manually
o
.
testRevisionStorage
.
unshift
(
response
.
rev
);
o
.
buildTestTree
=
{
"
kids
"
:[],
"
rev
"
:
o
.
testRevisionStorage
[
0
],
"
status
"
:
'
available
'
,
"
type
"
:
'
leaf
'
};
//
TEST
4) check file was created
// ========================================
// 4) check file was created
checkFile
(
response
,
o
,
null
,
true
);
// TEST 5) check tree was created
// ========================================
// 5) check tree was created
checkTreeNode
(
response
,
o
,
null
,
true
);
});
// 3) TEST PUT content
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
//
update document
// ========================================
//
6) PUT UPDATE (modify content)
o
.
jio
.
put
({
"
content
"
:
'
content_modified
'
,
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
o
.
testRevisionStorage
[
0
]},
function
(
err
,
response
)
{
o
.
spy
(
o
,
'
value
'
,{
"
ok
"
:
true
,
"
id
"
:
response
.
id
,
"
rev
"
:
response
.
rev
},
'
PUT content = ok
'
);
o
.
f
(
response
);
...
...
@@ -847,23 +850,20 @@ test ('Put', function(){
o
.
testRevisionStorage
[
0
],
"
status
"
:
'
available
'
,
"
type
"
:
'
leaf
'
}],
"
rev
"
:
o
.
testRevisionStorage
[
1
],
"
status
"
:
'
deleted
'
,
"
type
"
:
'
branch
'
};
//
TEST
7) check document was replaced
// ========================================
// 7) check document was replaced
checkFile
(
response
,
o
,
null
,
true
);
// TEST 8) check tree was updated
// ========================================
// 8) check tree was updated
checkTreeNode
(
response
,
o
,
null
,
true
);
});
// 6) TEST PUT UPDATE
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
//
update document 2nd time
// ========================================
//
9. update document (modify again)
o
.
jio
.
put
({
"
content
"
:
'
content_modified_again
'
,
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
o
.
testRevisionStorage
[
0
]},
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
o
.
testRevisionStorage
[
0
]},
function
(
err
,
response
)
{
o
.
spy
(
o
,
'
value
'
,{
"
ok
"
:
true
,
"
id
"
:
response
.
id
,
"
rev
"
:
response
.
rev
},
'
PUT content = ok
'
);
o
.
f
(
response
);
...
...
@@ -876,49 +876,47 @@ test ('Put', function(){
"
rev
"
:
o
.
testRevisionStorage
[
2
],
"
status
"
:
'
deleted
'
,
"
type
"
:
'
branch
'
};
//
TEST
10) check document was replaced
// 10) check document was replaced
checkFile
(
response
,
o
,
null
,
true
);
//
TEST
11) check tree was updated
// 11) check tree was updated
checkTreeNode
(
response
,
o
,
null
,
true
);
});
// 9) TEST PUT UPDATE
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
// TEST 12) PUT false revision
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
conflict
'
,
"
message
"
:
'
Document update conflict.
'
,
"
reason
"
:
'
Revision supplied is not the latest revision
'
,
"
status
"
:
409
,
"
statusText
"
:
'
Conflict
'
},
'
PUT false revision = 409 Conflict
'
);
// ========================================
// 12) PUT false revision
o
.
jio
.
put
({
"
content
"
:
'
content_modified_false
'
,
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
o
.
falseRevision
},
o
.
f
);
"
_rev
"
:
o
.
falseRevision
},
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
conflict
'
,
"
message
"
:
'
Document update conflict.
'
,
"
reason
"
:
'
Revision supplied is not the latest revision
'
,
"
status
"
:
409
,
"
statusText
"
:
'
Conflict
'
},
'
PUT false revision = 409 Conflict
'
);
o
.
f
(
err
);
});
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
// TEST 13) SYNC-PUT no revs_info
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
conflict
'
,
"
message
"
:
'
Document update conflict.
'
,
"
reason
"
:
'
Missing revs_info required for sync-put
'
,
"
status
"
:
409
,
"
statusText
"
:
'
Conflict
'
},
'
PUT no sync info = 409 Conflict
'
);
// ========================================
// 13) SYNC-PUT no revs_info
o
.
jio
.
put
({
"
content
"
:
'
content_modified_false
'
,
"
_id
"
:
'
myDoc
'
,
"
_rev
"
:
'
1-abcdefg
'
},
o
.
f
);
"
_rev
"
:
'
1-abcdefg
'
},
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
conflict
'
,
"
message
"
:
'
Document update conflict.
'
,
"
reason
"
:
'
Missing revs_info required for sync-put
'
,
"
status
"
:
409
,
"
statusText
"
:
'
Conflict
'
},
'
PUT no sync info = 409 Conflict
'
);
o
.
f
(
err
);
});
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
// add a new document version with fake revs_info
...
...
@@ -935,8 +933,8 @@ test ('Put', function(){
fake_id_2
=
o
.
testRevisionStorage
[
2
].
split
(
'
-
'
)[
1
];
fake_id_1
=
o
.
testRevisionStorage
[
1
].
split
(
'
-
'
)[
1
];
fake_id_0
=
o
.
testRevisionStorage
[
0
].
split
(
'
-
'
)[
1
];
//
put a new document version
// ========================================
//
14) PUT UPDATE A TREE using revs_info
o
.
jio
.
put
({
"
content
"
:
'
a_new_version
'
,
"
_id
"
:
'
myDoc
'
,
...
...
@@ -946,7 +944,7 @@ test ('Put', function(){
{
"
rev
"
:
"
3-a9dac9ff5c8e1b2fce58e5397e9b6a8de729d5c6eff8f26a7b71df6348986123
"
,
"
status
"
:
"
deleted
"
},
{
"
rev
"
:
fake_rev_1
,
"
status
"
:
"
deleted
"
},
{
"
rev
"
:
fake_rev_0
,
"
status
"
:
"
deleted
"
}
],
],
"
_revisions
"
:{
"
start
"
:
4
,
"
ids
"
:[
...
...
@@ -957,8 +955,6 @@ test ('Put', function(){
]}
},
function
(
err
,
response
)
{
//o.testRevisionStorage.unshift(response.rev);
o
.
buildTestTree
=
{
"
kids
"
:[
{
...
...
@@ -975,23 +971,18 @@ test ('Put', function(){
"
rev
"
:
o
.
testRevisionStorage
[
1
],
"
status
"
:
'
deleted
'
,
"
type
"
:
'
branch
'
}],
"
rev
"
:
o
.
testRevisionStorage
[
2
],
"
status
"
:
'
deleted
'
,
"
type
"
:
'
branch
'
};
o
.
spy
(
o
,
'
value
'
,{
"
ok
"
:
true
,
"
id
"
:
response
.
id
,
"
rev
"
:
response
.
rev
},
'
PUT SYNC = ok
'
);
o
.
f
(
response
);
// TEST 15) check document was stored
// 15) check document was stored
checkFile
(
response
,
o
,
null
,
true
);
//
TEST
16) check tree was updated
// 16) check tree was updated
checkTreeNode
(
response
,
o
,
null
,
true
);
});
// 14) TEST PUT UPDATE
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
/*
//
put a new deleted version
// ========================================
//
17) PUT UPDATE (deleted tree)
o
.
jio
.
put
({
"
content
"
:
'
a_deleted_version
'
,
"
_id
"
:
'
myDoc
'
,
...
...
@@ -1000,19 +991,17 @@ test ('Put', function(){
{
"
rev
"
:
"
3-05210795b6aa8cb5e1e7f021960d233cf963f1052b1a41777ca1a2aff8fd4b61
"
,
"
status
"
:
"
deleted
"
},
{
"
rev
"
:
"
2-67ac10df5b7e2582f2ea2344b01c68d461f44b98fef2c5cba5073cc3bdb5a844
"
,
"
status
"
:
"
deleted
"
},
{
"
rev
"
:
fake_rev_2
,
"
status
"
:
"
deleted
"
}
],
],
"
_revisions
"
:{
"
start
"
:
3
,
"
ids
"
:[
"
05210795b6aa8cb5e1e7f021960d233cf963f1052b1a41777ca1a2aff8fd4b61
"
,
"
67ac10df5b7e2582f2ea2344b01c68d461f44b98fef2c5cba5073cc3bdb5a844
"
,
fake_id_2
]}
]}
},
function
(
err
,
response
)
{
//o.testRevisionStorage.unshift(response.rev);
o
.
buildTestTree
=
{
"
kids
"
:[{
"
kids
"
:[
...
...
@@ -1049,23 +1038,83 @@ test ('Put', function(){
"
status
"
:
'
deleted
'
,
"
type
"
:
'
branch
'
};
o
.
spy
(
o
,
'
value
'
,{
"
ok
"
:
true
,
"
id
"
:
response
.
id
,
"
rev
"
:
response
.
rev
},
'
PUT SYNC dead leaf = ok
'
);
o
.
f
(
response
);
// TEST 18) check document was stored
//checkFile(response, o, null, true);
// TEST 19) check tree was updated
//checkTreeNode(response, o, null, true);
// 18) check document was stored
checkFile
(
response
,
o
,
null
,
true
);
// 19) check tree was updated
checkTreeNode
(
response
,
o
,
null
,
true
);
});
// 17) TEST PUT UPDATE
//checkReply(o,null,true);
*/
checkReply
(
o
,
null
,
true
);
o
.
clock
.
tick
(
base_tick
);
// END PUT
o
.
jio
.
stop
();
o
.
clean
;
});
// ====================== PUTATTACHMENT ==========================
test
(
'
PutAttachment
'
,
function
(){
// runs following assertions
// 1) PUTATTACHMENT with wrong id/rev1
// 2) PUTATTACHMENT without id/rev1
var
o
=
{};
o
.
t
=
this
;
o
.
clock
=
o
.
t
.
sandbox
.
useFakeTimers
();
o
.
falseRevision
;
localstorage
=
{
getItem
:
function
(
item
)
{
return
JSON
.
parse
(
localStorage
.
getItem
(
item
));
},
setItem
:
function
(
item
,
value
)
{
return
localStorage
.
setItem
(
item
,
JSON
.
stringify
(
value
));
},
deleteItem
:
function
(
item
)
{
delete
localStorage
[
item
];
}
};
o
.
clock
.
tick
(
base_tick
);
o
.
spy
=
basic_spy_function
;
o
.
clean
=
clean_up_local_storage_function
();
o
.
username
=
'
MrPuttAttachment
'
;
o
.
testRevisionStorage
=
[];
// let's go
o
.
jio
=
JIO
.
newJio
({
type
:
'
local
'
,
username
:
o
.
username
,
applicationname
:
'
jiotests
'
});
// ========================================
// 1) PUTATTACHMENT with wrong id/rev
o
.
jio
.
putAttachment
(
"
ABC/DEF
"
,
"
A-1aaa
"
,
"
<b>hello</b>
"
,
"
text/html
"
,
function
(
err
,
response
){
o
.
spy
(
o
,
'
value
'
,{
"
error
"
:
'
not found
'
,
"
message
"
:
'
Document not found.
'
,
"
reason
"
:
'
Document not found, please check document ID
'
,
"
status
"
:
404
,
"
statusText
"
:
'
Not found
'
},
'
PUTATTACHMENT without id = 404 NOT FOUND
'
);
o
.
f
(
err
);
});
checkReply
(
o
,
null
,
true
);
// ========================================
// 2) PUTATTACHMENT with wrong id/rev
/*
o.jio.putAttachment("ABC/DEF","text/html","<b>hello</b>",function(err, response){
o.spy (o,'value',{
"error": 'not found',
"message": 'Document not found.',
"reason": 'Document not found, please check document ID',
"status": 404,
"statusText": 'Not found'
},'PUTATTACHMENT without id = 404 NOT FOUND');
o.f(err);
});
checkReply(o,null,true);
*/
});
/*
test ('Document load', function () {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment