Braindump is an alternative to Evernote. As I want to be in control of my own notes and bookmarks, I've decided to take a shot at developing my own note takeing app.
This project contains the backend and API part of the project. It aims to provide a simple REST-style API to to store and retrieve notes. These notes will be stored in a server side database.
See Braindump Client for a HTML/Javascript based client.
Currently, storing and retrieving simple HTML notes is supported. If this project works out well I'll be adding functionality so Braindump can serve as a reasonable alternative to Evernote.
Current features:
- Maintaining/retrieving Notebooks: A notebook contains a number of Notes
- Maintaining/retrieving Notes: A note is a piece of plaintext or HTML contained in a Notebook
- Simple admin console embedded in this project
- Import/export of notes
- Multiple users
- Search
Planned features:
- Tagging of notes
- Paste images/attachments
- Security (Encryption of notes)
vendor/bin/phake taskname
###Data Model
####Notebook
| field | type |
|---|---|
| id | id |
| title | string |
####Note
| field | type |
|---|---|
| id | id |
| notebook_id | foreign_key |
| title | string |
| created | timestamp |
| updated | timestamp |
| url | url |
| type | 'HTML' or 'Text' |
| content | string |
Future versions:
####Tag
| field | type |
|---|---|
| tag_id | id |
| note_id | foreign_key |
| tag | string |
Note: For a procedure for moving a note from one notebook to another, see the F.A.Q.
| Url | Operation | Description |
|---|---|---|
| / | GET | Alias of /notebooks |
| /notebooks | GET | Retrieves list of available Notebooks |
/notebooks/:id | GET | Retrieves details of Notebook with given :id |
| /notebooks | POST | Creates a new notebook |
/notebooks/:id | PUT | Updates notebook with given :id |
/notebooks/:id | DELETE | Deletes notebook with given :id |
/notes?q=:query | GET | Retrieve an optionally filtered list of all available notes |
/notebooks/:id/notes?q=:query | GET | Retrieve an optionally filtered list of notes in Notebook with :id (without content) |
/notebooks/:notebook_id/notes/:note_id | GET | Get details of note with :note_id (with content) |
/notes/:note_id | GET | Alias of /notebooks/:notebook_id/notes/:note_id |
/notebooks/:id/notes | POST | Creates a new note |
/notebooks/:notebook_id/notes/:note_id | PUT | Updates the given note and makes sure it is contained in the notebook with id :id |
/notebooks/:id/notes/:note_id | DELETE | Deletes the note with :note_id |
| /notes/:note_id | DELETE | Alias of /notebooks/:id/notes/:note_id |
Alias of /notebooks
Retrieves a list of available Notebooks.
Use query parameter sort to specify a list of fields to sort by: /notebooks?sort=title,-id means: sort by title, then by id descending.
Example Response:
[ { "id": 1, "title": "Test Notebook", "noteCount": 1 }, { "id": 2, "title": "Another Notebook", "noteCount": 1 }, { "id": 3, "title": "Empty Notebook", "noteCount": 0 } ] Retrieves details of Notebook with given :id
Example Response:
{ "id": 1, "title": "Test Notebook", "noteCount": 1 } Creates a new notebook
Example Request:
HTTP Request Headers: Content-Type: application/json
{ "title": "New Notebook" } Example Response:
{ "id": 1, "title": "New Notebook", "noteCount": 0 } Updates notebook with given :id
Example Request:
HTTP Request Headers: Content-Type: application/json
{ "id": 1, "title": "Modified title" } Example Response:
{ "id": 1, "title": "Modified title", "noteCount": 0 } Deletes notebook with given :id, also deletes all notes contained in this notebook
Retrieve list of all available notes. If :query is supplied, only results with matching title or content are returned.
Use query parameter sort to specify a list of fields to sort by: /notebooks?sort=title,-id means: sort by title, then by id descending.
Retrieves a list of Notes contained in given notebook, without the actual content of the notes. If :query is supplied, only results with matching title or content are returned.
Use query parameter sort to specify a list of fields to sort by: /notebooks?sort=title,-id means: sort by title, then by id descending.
Example Response:
[ { "id": 1, "notebook_id": 1, "title": "Test Note from SQLite", "created": 1398979024, "updated": 1398979024, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note" }, { "id": 2, "notebook_id": 1, "title": "Another test note", "created": 1398979024, "updated": 1398979024, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note" } ] Retrieves details of Note with given :note_id (contained in Notebook with :notebook_id). Includes the content of the note.
Note: redirects to url with correct notebook_id if the note exists in a different notebook.
Example Response:
{ "id": 1, "notebook_id": 1, "title": "Test Note from SQLite", "created": 1398979024, "updated": 1398979024, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note" } Retrieves details of Note with given :note_id
Alias of /notebooks/:notebook_id/notes/:note_id but without the check on :notebook_id.
Creates a new note in given notebook.
Example Request:
HTTP Request Headers: Content-Type: application/json
{ "title": "Test Note from SQLite", "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note" } Example Response:
{ "id": 1, "notebook_id": 1, "title": "Test Note from SQLite", "created": 1398979024, "updated": 1398979024, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note"} } Updates note in notebook with given :note_id (contained in Notebook with :notebook_id)
Note: redirects to url with correct notebook_id if the note exists in a different notebook.
Example Request:
HTTP Request Headers: Content-Type: application/json
{ "title": "Modified Title", "url": "http:\/\/www.google.com", "type": "Text", "content": "This is some modified content" } Example Response:
{ "id": 1, "notebook_id": 1, "title": "Modified Title", "created": 1398979024, "updated": 1398979034, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is some modified content"} } Deletes note with given :note_id (contained in Notebook with :notebook_id)
Note: redirects to url with correct notebook_id if the note exists in a different notebook.
Deletes note with given :note_id
Alias of /notebooks/:notebook_id/notes/:note_id but without the check on :notebook_i)
###How do move a note from one notebook to another?
Execute a PUT Request to the note with the target notebook id in the url
Example:
Consider the following note, contained in the notebook with id 1:
{ "id": 1, "notebook_id": 1, "title": "Test Note from SQLite", "created": 0, "updated": 0, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note" } To move it to the notebook with id 2, Execute the following Request:
/notebooks/2/notes/1 PUT
HTTP Request Headers: Content-Type: application/json
{ "id": 1, "notebook_id": 1, "title": "Test Note from SQLite", "created": 0, "updated": 0, "url": "http:\/\/www.google.com", "type": "Text", "content": "This is a note" } - Exand README into:
README FAQ INSTALL CHANGE_LOG (for every release)
- Parsing large xml documents: http://stackoverflow.com/questions/911663/parsing-huge-xml-files-in-php (for evernote import)
- http://dev.evernote.com/doc/articles/enml.php for evenrote html format
- https://phpbestpractices.org
- http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api