1
swtstore (Sweet Store)
2
======================
3
4
----
5
6
7
Introduction
8
------------
9
10
This is the sweet store application.
11
The store for the decentralized, semantic, social web tweets a.k.a SWeeTs!
12
13
This README is about installing, configuring and running/deploying this
14
application. If you want to know more about SWeeTs, please go to
15
[wiki.janastu.org/Sweet_Web](http://janastu.org/technoscience/index.php/Sweet_Web) and
16
[trac.pantoto.org/sweet-web](http://trac.pantoto.org/sweet-web).
17
18
This application acts as the repository store for all the SWeeTs that are
19
generated from the clients registered with the sweet store. It provides
20
query APIs to query the SWeeTs.
21
22
It also provides user management to manage the users of the swtstore.
23
24
All the APIs of the swtstore are accessed by using an access token which is
25
generated by the swtstore when an user authorizes a third-party application
26
through OAuth.
27
28
Sweet store provides the following APIs:
29
30
    - [GET] /api/sweets/<id>: Get a specific SWeeT by its id.
31
32
    - [GET] /api/sweets/q?who=<username>&what=<contextname>&where=<URL> :
33
      This API is for querying sweet based on the who, what and where
34
      parameters.
35
      This API does not support querying based on parameters mentioned in how,
36
      but will be supported in future. Right now, the client can get sweets
37
      based on the above mentioned three parameters, and as the 'how' part is
38
      a JSON, it is trivial to do further filtering based on parameters of
39
      'how' by the client.
40
41
    - [POST] /api/sweets : Post a SWeeT to this swtstore with the data in the
42
    body of the request. The data or payload is a list of sweets. Even if you
43
    are sending one sweet, make sure that the sweet is in a list.
44
45
    - [GET] /api/users/me : Get a JSON details of the current user logged in.
46
47
48
Any third-party client side application can communicate with the swtstore
49
using these APIs, provided they have a valid access token.
50
51
52
Pre-requisites
53
--------------
54
55
The swtstore application is written in Python and uses a relational database.
56
57
Hence, the dependencies of this application are:
58
59
  * Python 2.7. See [here](https://www.python.org/about/gettingstarted/)
60
    for more details on installing Python.
61
62
  * any relational database supported by SQLAlchemy. Most common RDBMS
63
    supported by SQLAlchemy are MySQL, Postgresql.
64
65
    For more information on supported databases see
66
    [here](http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html).
67
68
    _Installing and setting up a database like MySQL or Postgresql is out of scope
69
    of this document. Please search the Internet to get help about installing and
70
    setting up a RDBMS._
71
72
  * Also, make sure you have [pip](https://pip.pypa.io/en/latest/) installed, as
73
    swtstore depends of few external python packages.
74
    See [here](https://pip.pypa.io/en/latest/) to get more details.
75
76
**NOTE: Make sure you have the pre-requisites installed before following the
77
installation steps.**
78
79
80
Installing
81
----------
82
83
* Clone the repository from <https://git.pantoto.org/sweet-web/sweet-web-engine>
84
85
  > `` $ git clone --recursive https://git.pantoto.org/sweet-web/sweet-web-engine.git ``
86
87
  If you have already cloned the repo, and then reading this README, you have
88
  to get the submodules. Run this from the top-level of this repo:
89
90
  > `` $ git submodule init ``
91
92
  > `` $ git submodule update ``
93
94
95
* It is recommended to do the installation inside a python virtual
96
  environment.
97
  For deploying on a server, it depends on how you have setup your server
98
  environment.
99
  If you think, you know what you are doing and don't need the virtual
100
  environment, you can skip to the next step.
101
102
  Initialize a python virtual environment using `virtualenv` in the same directory
103
  where you cloned the repository in the above step. Now, activate the
104
  environment
105
106
  > ``$ source <path/to/your/current-virtual-env>/bin/activate ``
107
108
  See [http://www.virtualenv.org/en/latest/virtualenv.html](http://www.virtualenv.org/en/latest/virtualenv.html) for more details about `virtualenv`.
109
110
* Run the setup.py script to install  `` python setup.py install ``
111
112
113
You're done with the installation step.
114
115
Now you need to configure swtstore to run it correctly.
116
117
118
Configure swtstore
119
------------------
120
121
* Make sure you have configured the user management module with correct values.
122
123
* Copy the contents of ``sample_config.py`` inside the ``swtstore`` directory
124
  into ``config.py`` inside ``swtstore`` directory itself.
125
126
  Assuming you are using a \*-nix based system, and you are in the root directory
127
  of the codebase,
128
129
  > `` $ cp swtstore/sample_config.py swtstore/config.py``
130
131
* Install the required driver for using database mentioned in the
132
  SQLALCHEMY_DATABASE_URI. Install pyscopg2 if you have chosen postgresql as
133
  the database to use.
134
135
  > `` $ pip install psycopg2 ``
136
137
  Install oursql if you have chosen mysql as the database to use.
138
139
  > `` $ pip install oursql``
140
141
  You would also have to install dependecies, for using mysql:
142
  - python-dev
143
  - libmysqlclient-dev
144
  Install these dependencies from the package manager of your distribution.
145
146
* Edit the config.py file, and change the values accordingly.
147
148
* Now, you have to setup the database for the swtstore application. But
149
  fortunately, the creation of database and tables have also been scripted, so
150
  all you need to do is run the ``dbsetup.py`` script.
151
152
  > `` $ python dbsetup.py ``
153
154
**NOTE:** Please remember that all these configuration step is necessary and is
155
required whether you are running the application locally or deploying it on a
156
server.
157
158
159
160
Running the server locally
161
--------------------------
162
163
Run the runserver.py script to run the server locally,
164
165
> `` $ python runserver.py ``
166
167
This runs the application locally, on port 5001. So you can direct your browser
168
to http://localhost:5001
169
170
171
172
Deploying the application
173
-------------------------
174
175
SwtStore is deployed as a WSGI application server.
176
177
The wsgi script to deploy the application is provided (its called
178
`swtstore.wsgi`).
179
Point your webserver like Apache, or Nginx to point to the `swtstore.wsgi`
180
script.
181
182
See Apache WSGI configuration here:
183
[http://modwsgi.readthedocs.org/en/latest/configuration-directives/WSGIScriptAlias.html](http://modwsgi.readthedocs.org/en/latest/configuration-directives/WSGIScriptAlias.html)
184
185
See Nginx WSGI configuration here:
186
[http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html](http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html)
187
188
189
Help / Feedback
190
---------------
191
192
If you need any help, or have any questions, comments or feedback, you can contact at
193
rayanon or arvind or bhanu at servelots.com
194
195
You can also join channel #servelots on freenode network, using your favourite
196
IRC client. We usually hang out at #servelots.
197
198
199
License
200
-------
201
202
BSD Licensed.
203
204
See LICENSE for more details.
205
206
207
Known Issues
208
------------
209
210
* Infinite loop in Persona sign-in flow. When the backend API /users/login fail
211
  to connect to the Mozilla Persona APIs (connection timed out etc.) - the
212
  /users/login returns a 500, and then the Persona Javascript SDK calls the
213
  logout API /users/logout and then it calls the login API again; as a result
214
  the entire sign-in flow falls in a infinite loop.
215
216
* Automatic log out from Persona. Persona forces a user to login, again, when he
217
  opens SWeeT store while being logged into Persona, through a different
218
  site. Persona requires the user, every time, to explicilty say that he is
219
  agreeing to share the email adress with a site that is using Persona API.