Return-Path: X-Original-To: apmail-usergrid-commits-archive@minotaur.apache.org Delivered-To: apmail-usergrid-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id DA0A717223 for ; Wed, 22 Oct 2014 16:17:58 +0000 (UTC) Received: (qmail 9267 invoked by uid 500); 22 Oct 2014 16:17:58 -0000 Delivered-To: apmail-usergrid-commits-archive@usergrid.apache.org Received: (qmail 9208 invoked by uid 500); 22 Oct 2014 16:17:58 -0000 Mailing-List: contact commits-help@usergrid.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@usergrid.incubator.apache.org Delivered-To: mailing list commits@usergrid.incubator.apache.org Received: (qmail 9168 invoked by uid 99); 22 Oct 2014 16:17:58 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 22 Oct 2014 16:17:58 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 3C49D9B2745; Wed, 22 Oct 2014 16:17:58 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: sungju@apache.org To: commits@usergrid.apache.org Date: Wed, 22 Oct 2014 16:17:58 -0000 Message-Id: <5f8e83188f4f4fa38d8e9efb9a242a04@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/6] Changing document systems to Sphinx Repository: incubator-usergrid Updated Branches: refs/heads/putting-docs-on-git [created] 5ba3b73f7 http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/concepts/query-language.md ---------------------------------------------------------------------- diff --git a/docs/concepts/query-language.md b/docs/concepts/query-language.md new file mode 100644 index 0000000..bd337ac --- /dev/null +++ b/docs/concepts/query-language.md @@ -0,0 +1,427 @@ +# Query Language + +> Query examples in this content are shown unencoded to make +> them easier to read. Keep in mind that you might need to encode query +> strings if you're sending them as part of URLs, such as when you're +> executing them with the cURL tool. + +The following example retrieves a list of restaurants (from a +restaurants collection) whose name property contains the value "diner", +sorting the list in ascending order by name: + + /restaurants?ql=select * where name contains 'diner' order by name asc + + +## Basic syntax + +Queries of Apigee data for Apache Usergrid are made up of two kinds of +statements: the path to the collection you want to query, followed by +the query language statement containing your query. These two statements +are separated by "?ql=" to indicate where the query language statement +starts. + +To retrieve items from a collection, you would use a syntax such as the +following: + + /?ql= + +In the following example, the query is retrieving all users whose name +is Gladys Kravitz. + + /users?ql=select * where name = 'Gladys Kravitz' + +The following example selects all items except those that have an a +property value of 5: + + /items?ql=select * where NOT a = 5 + +Note that there is a shortcut available when your query selects all +items matching certain criteria -- in other words, where you use a +statement that starts "select \* where". In this case, you can omit the +first part of the statement and abbreviate it this way: + + /items?ql=NOT a = 5 + +You query your Apache Usergrid data by using a query syntax that's like +Structured Query Language (SQL), the query language for relational +databases. Unlike a relational database, where you specify tables and +columns containing the data you want to query, in your Apache Usergrid +queries you specify collections and entities. + +The syntax of Apache Usergrid queries only *resembles* SQL to +make queries familiar and easier to write. However, the language isn't +SQL. Only the syntax items documented here are supported. + +## Supported operators + +Comparisons + +* Less than `<` or `lt` +* Less than or equal `<=` or `lte` +* Equal `=` or `eq` +* Greater than or equal `>=` or `gte` +* Greater than `>` or `gt` +* Not equal `NOT` + +Logical operations + +* Intersection of results `and` +* Union of results `or` +* Subtraction of results `not` + + +## Query Response Format + +the query’s response is formatted in +JavaScript Object Notation (JSON). This is a common format used for +parameter and return values in REST web services. + +So for the following query: + + /users?ql=select * where name = ‘Gladys Kravitz’ + +...you would get a response such as the the one below. The JSON format +arranges the data in name/value pairs. Many of the values correspond to +specifics of the request, including the request’s HTTP action (GET), the +application’s UUID, the request’s parameters (the query string you +sent), and so on. + +Here, the query is asking for whole entities in the users collection. +Data corresponding to the response is captured in the response’s +`entities` array. The array has one member here, corresponding to the +one user found by the query (another kind of query might have found more +users). That one member gives the UUID of the entity (user), the entity +type, and values for properties such as name, username, email, and so +on. + +```json +{ + "action" : "get", + "application" : "8272c9b0-d86a-11e2-92e2-cdf1ce04c1c0", + "params" : { + "ql" : [ "select * where name = 'Gladys Kravitz'" ] + }, + "path" : "/users", + "uri" : "http://api.usergrid.com/myorg/myapp/users", + "entities" : [ { + "uuid" : "d0d7d0ba-e97b-11e2-8cef-411c466c4f2c", + "type" : "user", + "name" : "Gladys Kravitz", + "created" : 1373472876859, + "modified" : 1373472876859, + "username" : "gladys", + "email" : "gladys@example.com", + "activated" : true, + "picture" : "http://www.gravatar.com/avatar/20c57d4f41cf51f2db44165eb058b3b2", + "metadata" : { + "path" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c", + "sets" : { + "rolenames" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/rolenames", + "permissions" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/permissions" + }, + "connections" : { + "firstname" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/firstname", + "lastname" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/lastname" + }, + "collections" : { + "activities" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/activities", + "devices" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/devices", + "feed" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/feed", + "groups" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/groups", + "roles" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/roles", + "following" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/following", + "followers" : "/users/d0d7d0ba-e97b-11e2-8cef-411c466c4f2c/followers" + } + } + } ], + "timestamp" : 1374694196061, + "duration" : 48, + "organization" : "myorg", + "applicationName" : "myapp", + "count" : 1 +} +``` + +Compare the preceding example with the following for another kind of +query. Imagine the following request string, where the query string is +asking for only the values of two of the entity’s properties (username +and name): + + /users?ql=select username,name where name=’Gladys Kravitz’ + +In the response JSON from this query, the return value is specified as +the property of the `list` item -- here, an array containing only the +values of the properties the query asked for, in the order they were +requested (username first, then name). + + { + "action" : "get", + "application" : "8272c9b0-d86a-11e2-92e2-cdf1ce04c1c0", + "params" : { + "ql" : [ "select username,name where name='Gladys Kravitz'" ] + }, + "path" : "/users", + "uri" : "http://api.usergrid.com/myorg/myapp/users", + "list" : [ [ "gladys", "Gladys Kravitz" ] ], + "timestamp" : 1374697463190, + "duration" : 25, + "organization" : "myorg", + "applicationName" : "myapp", + "count" : 1 + } + + +## Data types supported in queries + +As you develop queries for your Apache Usergrid data, remember that entity +properties each conform to a particular data type (whether the entity is +included by default or an entity you defined). Your queries must +acknowledge this, testing with values that conform to each property's +data type. (You can view the list of property data types for the default +entities at [Default Data Entities](/default-data-entities).) + +For example, in the default entity `User`, the `name` property is stored +as a `string`, the created date as a `long`, and metadata is stored as a +JSON object. Your queries must be data type-aware so that you can be +sure that query results are as you expect them to be. + +So imagine you define an entity with a `price` property whose value +might be `100.00`. Querying for `100` will return no results even if +there are occurrences of `100.00` as `price` values in your data set. +That's because the database expected a decimal-delimited `float` value +in your query. + + +Data Type Examples Notes +----------- ------------------------------------------------------------------------------------------- --------- +`string` `'value'`, `unicode '\uFFFF'`, `octal '\0707'` true | false +`long` 1357412326021 Timestamps are typically stored as `long` values. +`float` 10.1, -10.1, 10e10, 10e-10, 10E10, 10e-10 Your query must be specific about the value you're looking for, down to the value (if any) after the decimal point. +`boolean` true | false +`UUID` ee912c4b-5769-11e2-924d-02e81ac5a17b UUID types are typically used for the unique IDs of entities. The value must conform to the following format (do not enclose with quotation marks): xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx + + +`object` For a JSON object like this one: + +``` + { + "items":[ + {"name":"rocks"}, + {"name":"boats"} + ] + } +``` + +you can use dot notation to reach property values in the object: /mycollection/thing?ql="select * where items.name = 'rocks'" Objects are often used to contain entity metadata, such as the activities associated with a user, the users associated with a role, and so on. + +## Retrieving values for multiple properties + +Your query can return multiple kinds of values -- such as the values of +multiple properties -- by specifying the property names in your select +statement as a comma-separated list. + +For example, the following request returns the address and phone number +of users whose name is Gladys Kravitz: + + /users?ql=select address,phone_number where name = 'Gladys Kravitz' + + +## Querying for the contents of text + +Your query can search the text of entity values of the string data type. +For example, you can search a postal code field for values that start +with a specific three numbers. + +For example, the following query selects all restaurants with the word +`diner` in the name: + + /restaurants?ql=select * where name contains 'diner' + +**Note:** Not all string properties of the default entities are +indexed for searching. This includes the `User` entity's `username` +property. + +This will return all users whose name property contains the word 'Kravitz' + + /users?ql=select * where name contains 'Kravitz' + +This will return all users whose name property contains a word beginning with 'Krav' + + /users?ql=select * where name contains 'Krav*' + +This will return all users whose name is exactly 'Gladys Kravitz' + + /users?ql=select * where name = 'Gladys Kravitz' + + +## Sorting results + +You can return query results that are sorted in the order you specify. +Use the `order by` clause to specify the property to sort by, along with +the order in which results should be sorted. The syntax for the clause +is as follows `order by asc | desc` + +The following table includes a few examples: + + /users?ql=select * where lastname = 'Smith' order by firstname asc + + + /users?ql=select * where lastname = 'Smith' order by firstname desc + + + /users?ql=select * where lastname contains 'Sm*' order by lastname asc, firstname asc + + +## Geoqueries + +Many of today's apps are enhanced by the use of *geolocation*, wireless +detection of the physical location of a remote device. These apps are +said to be *geolocation-aware* in that they query the device to +determine the user's position and then use this data to further enhance +the user's experience. For example, apps can capture the exact location +where a picture was taken or a message was created. + +App services support geolocation on any entity, both built in (e.g., +users, groups) and user defined. + +To add a location to any entity, include the following member to the +JSON in a POST or PUT call: + + "location": { + "latitude": 37.779632, + "longitude": -122.395131 + } + +For example, to store a listing of restaurants and their locations, +start by creating a collection called restaurants: + + POST https://api.usergrid.com/org_name/app_name/restaurants + +Next, add a new entity to the collection: + + POST https://api.usergrid.com/org_name/app_name/restaurants + { + "name": "Rockadero", + "address": "21 Slate Street, Bedrock, CA", + "location": { + "latitude": 37.779632, + "longitude": -122.395131 + } + } + +This creates a new restaurant entity called "Rockadero" with the +longitude and latitude included as part of the object. + +When a location is added to an entity, it is easy to make queries +against that data. For example, to see all restaurants within a 10 mile +radius of the user's location, make a GET call against that entity, and +include a search query in the following format: + + location within of , + +If we use the location of our user Fred, we first need to convert miles +to meters. 1 mile is equivalent to 1609.344 meters, so 10 miles is about +16093 meters. Thus, the API call looks like this: + + GET https://api.usergrid.com/org_name/app_name/restaurants?ql=location within 16093 of 37.776753, -122.407846 + + +## Managing large sets of results + +When your query might return more results than you want to display to +the user at once, you can use the limit parameter with cursors or API +methods to manage the display of results. By default, query results are +limited to 10 at a time. You can adjust this by setting the limit +parameter to a value you prefer. + +For example, you might execute a query that could potentially return +hundreds of results, but you want to display 20 of those at a time to +users. To do this, your code sets the limit parameter to 20 when +querying for data, then provides a way for the user to request more of +the results when they're ready. + +You would use the following parameters in your query: + ++-------------------------+-------------------------+-------------------------+ +| Parameter | Type | Description | ++=========================+=========================+=========================+ +| `limit` | integer | Number of results to | +| | | return. The maximum | +| | | number of results is | +| | | 1,000. Specifying a | +| | | limit greater than | +| | | 1,000 will result in a | +| | | limit of 1,000. | +| | | | +| | | Limit is applied to the | +| | | collection, not the | +| | | query string. For | +| | | example, the following | +| | | query will find the | +| | | first 100 entities in | +| | | the books collection, | +| | | then from that set | +| | | return the ones with | +| | | author='Hemingway': | +| | | | +| | | /books?ql=author = | +| | | 'Hemingway'&limit=100 | +| | | | +| | | You can also use the | +| | | limit parameter on a | +| | | request without a query | +| | | string. The following | +| | | example is shorthand | +| | | for selecting all books | +| | | and limiting by 100 at | +| | | a time: | +| | | | +| | | /books?limit=100 | +| | | | +| | | Using a limit on a | +| | | DELETE can help you | +| | | manage the amount of | +| | | time it takes to delete | +| | | data. For example you | +| | | can delete all of the | +| | | books, 1000 at a time, | +| | | with the following: | +| | | | +| | | DELETE /books?limit | +| | | =1000 | +| | | | +| | | Keep in mind that | +| | | DELETE operations can | +| | | take longer to execute. | +| | | Yet even though the | +| | | DELETE query call might | +| | | time out (such as with | +| | | a very large limit), | +| | | the operation will | +| | | continue on the server | +| | | even if the client | +| | | stops waiting for the | +| | | result. | ++-------------------------+-------------------------+-------------------------+ +| `cursor` | string | An encoded | +| | | representation of the | +| | | query position pointing | +| | | to a set of results. To | +| | | retrieve the next set | +| | | of results, pass the | +| | | cursor with your next | +| | | call for most results. | ++-------------------------+-------------------------+-------------------------+ + +For example: + +Select all users whose name starts with fred, and returns the first 50 +results: + + /users?ql=select * where name = 'fred*'&limit=50 + +Retrieve the next batch of users whose name is "fred", passing the +cursor received from the last request to specify where the next set of +results should begin: + + /users?ql=select * where name = 'fred*'&limit=50&cursor=LTIxNDg0NDUxNDpnR2tBQVFFQWdITUFDWFJ2YlM1emJXbDBhQUNBZFFBUUQyMVZneExfRWVLRlV3TG9Hc1doZXdDQWRRQVFIYVdjb0JwREVlS1VCd0xvR3NWT0JRQQ http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/concepts/relationships.md ---------------------------------------------------------------------- diff --git a/docs/concepts/relationships.md b/docs/concepts/relationships.md new file mode 100644 index 0000000..e039e09 --- /dev/null +++ b/docs/concepts/relationships.md @@ -0,0 +1,100 @@ +# Relationships + +Creating connections between entities +------------------------------------- + +One of the most useful features of App services is the ability to create +connections between entities. A simple example of this is the +Twitter-like use of *following*, where one user forms a connection with +another by subscribing to any tweets they post. [Messagee +Example](/messagee-example) walks you through an example of following +other users in our sample app, *Messagee*. Here is the basic format: + + POST https://api.usergrid.com/my-org/my-app/users/fred/following/users/barney + +This API call results in two users, Fred and Barney, linked with a +connection where Fred is following Barney. + +If you create a *following* connection between two users, Apache Usergrid +automatically creates a virtual connection called *followers* that +mirrors the *following* connection. In other words, if you create a +connection where Fred is following Barney, Apache Usergrid automatically +creates a virtual connection where Fred is a follower of Barney. + +Note that there is no mirror connection established. Apache Usergrid only +creates a mirror connection when you create a *following* connection. It +does not create a mirror connection for other verbs such as likes. + +You can see all the users that Fred is following, in this case only +Barney, by making the following API call: + + GET https://api.usergrid.com/my-org/my-app/users/fred/following + +You can see all of barney’s followers, in this case only Fred, by making +the following API call: + + GET https://api.usergrid.com/my-org/my-app/users/barney/followers + +The *followers* connection is a virtual connection because you can’t use +it to link two entities. In other words, you can’t make fred a follower +of barney by using a *followers* connection.  **This is wrong:** + + POST https://api.usergrid.com/my-org/my-app/users/barney/followers/users/fred + +To create a *following* connection with the users switched, so that +Barney is following Fred, do this: + + POST https://api.usergrid.com/my-org/my-app/users/barney/following/users/fred + +You can now see Fred’s followers (only Barney) by making the following +call: + + GET https://api.usergrid.com/my-org/my-app/users/fred/followers + +Creating other connections +-------------------------- + +You can extend this connection structure to create connections using any +"verb" that can link two entities. For example, you could use likes to +denote a connection between a user and his dog. First, create a dogs +collection: + + POST https://api.usergrid.com/my-org/my-app/dogs + +Then populate this collection with a new dog named Dino: + + POST https://api.usergrid.com/my-org/my-app/dogs {"name" : "dino"} + +Then create a likes connection between Fred and his dog Dino: + + POST https://api.usergrid.com/my-org/my-app/users/fred/likes/dogs/dino + +Getting connections +------------------- + +### Get all connections for an entity + +To get a list that only contains the connections, do a GET on the +connections sub-property of the entity: + + GET https://api.usergrid.com/my-org/my-app/users/fred/connections + +### Get information on a specific connection type + +To get a list of users who like Fred: + + GET https://api.usergrid.com/my-org/my-app/users/fred/connecting/likes + +To get a list of all dogs that Fred likes: + + GET https://api.usergrid.com/my-org/my-app/users/fred/likes/dog + +Deleting a connection +--------------------- + +You can delete a connection in a way similar to creating one. Just +replace the POST method with the DELETE method. For example, you can +delete the connection between fred and barney with the following API +call: + + DELETE https://api.usergrid.com/my-org/my-app/users/fred/following/barney http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/concepts/roles-and-permissions.md ---------------------------------------------------------------------- diff --git a/docs/concepts/roles-and-permissions.md b/docs/concepts/roles-and-permissions.md new file mode 100644 index 0000000..d237c13 --- /dev/null +++ b/docs/concepts/roles-and-permissions.md @@ -0,0 +1,18 @@ +# Roles & Permissions + +## Roles + +A role represents a set of permissions that enable certain operations to +be performed on a specific endpoint. You can assign a user to a role, +and in this way give the user the permissions associated with that role. + +**Note:** The /rolenames endpoint is no longer valid. If your code currently +makes calls to /rolenames, you need to change the calls to use /roles. + +## Permissions + +Each role contains multiple permissions. Permissions work by whitelisting by default, meaning any permission that is not explicitely granted is denied by default. Permission is an HTTP verb (GET to allow reads, POST to allow creation, PUT to allow edits and DELETE to allow deletes) combined with a path, with optional wildcards. For example the permission put:/users/* allows editing any user. + +Permissions can be added to roles, groups or to users directly, and a user’s permission is the combination of its personal permissions and the permissions of any role he’s been assigned, and the permissions of any group he’s a member of. + +Permissions are only valid within the scope of a single application, so the permission paths do not need to be prefixed with /org\_name\_or\_uuid/app\_name\_or\_uuid. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/concepts/users-devices.md ---------------------------------------------------------------------- diff --git a/docs/concepts/users-devices.md b/docs/concepts/users-devices.md new file mode 100644 index 0000000..4da5699 --- /dev/null +++ b/docs/concepts/users-devices.md @@ -0,0 +1,108 @@ +# Users & Devices + +Users and Devices are the primary ways to identify access to the system. Devices are great to track anonymous access, while Users allow you to model signing up, signing in, etc. + +Users +----- + +### Properties + +Property Type Description +------------ --------- --------------------------------------------------------------------------------- + uuid UUID User’s unique entity ID + type string Type of entity, in this case “user” + created long [UNIX timestamp](http://en.wikipedia.org/wiki/Unix_time) of entity creation + modified long [UNIX timestamp](http://en.wikipedia.org/wiki/Unix_time) of entity modification + username string Valid and unique string username (mandatory) + password string User password + email string Valid and unique email address + name string User display name + activated boolean Whether the user account is activated + disabled boolean Whether the user account is administratively disabled + firstname string User first name + middlename string User middle name + lastname string User last name + picture string User picture + + +### Sets + + Set Type Description + ------------- -------- --------------------------------------- + connections string Set of connection types (e.g., likes) + rolenames string Set of roles assigned to a user + permissions string Set of user permissions + credentials string Set of user credentials + +### Relationshops + + Collection Type Description + ------------ ---------- ----------------------------------------------------- + groups group Collection of groups to which a user belongs + devices device Collection of devices in the service + activities activity Collection of activities a user has performed + feed activity Inbox of activity notifications a user has received + roles role Set of roles assigned to a user + +### Facebook Sign-in + +You can authenticate your Apache Usergrid requests by logging into +Facebook. To access Apache Usergrid resources, you need to provide an +access token with each request (unless you use the sandbox app). You can +get an access token by connecting to an appropriate web service endpoint +and providing the correct client credentials — this is further described +in [Authenticating users and application +clients](/authenticating-users-and-application-clients). However, you +can also obtain an access token by logging into Facebook. + +To enable authentication to Apache Usergrid through Facebook, do the +following in your app: + +1. Make a login call to the Facebook API (do this using the [Facebook + SDK](https://developers.facebook.com/docs/sdks/) or + [API](https://developers.facebook.com/docs/facebook-login/)). If the + login succeeds, a Facebook access token is returned. +2. Send the Facebook access token to Apache Usergrid. If the Facebook + access token is valid and the user does not already exist in App + Services, Apache Usergrid provisions a new Apache Usergrid user. It also + returns an Apache Usergrid access token, which you can use for + subsequent Apache Usergrid API calls. Behind the scenes, Apache Usergrid + uses the Facebook access token to retrieve the user's profile + information from Facebook. + + If the Facebook access token is invalid, Facebook returns an OAuth + authentication error, and the login does not succeed. + +The request to authenticate to Apache Usergrid using a Facebook access +token is: + + GET https://api.usergrid.com/{my_org}/{my_app}/auth/facebook?fb_access_token={fb_access_token} + +where: + +* {my\_org} is the organization UUID or organization name.\ +* {my\_app} is the application UUID or application name.\ +* {fb\_access\_token} is the Facebook access token. + + +Devices +------- + +### Properties + +Property Type Description +---------- -------- --------------------------------------------------------------------------------- + uuid UUID Entity unique ID + type string Entity type (e.g., device) + created long [UNIX timestamp](http://en.wikipedia.org/wiki/Unix_time) of entity creation + modified long [UNIX timestamp](http://en.wikipedia.org/wiki/Unix_time) of entity modification + name string Device name (mandatory) + + +### Relationships + +Devices have the following associated collection. + + Collection Type Description + ------------ ------ ----------------------------------------------- + users user Collection of users to which a device belongs http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/conf.py ---------------------------------------------------------------------- diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..0ae99ab --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,273 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- +# +# Usergrid documentation build configuration file, created by +# sphinx-quickstart on Mon Jun 10 17:50:05 2013. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +sys.path.append(os.path.abspath('_ext')) +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', +] + + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.md' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Apache Usergrid' +copyright = u'2013-2014, Apache Usergrid' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +release = '1.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +html_theme_path = ["_theme"] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'usergrid' + + +# -- Options for LaTeX output -------------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +latex_documents = [ ( + u'index', 'Usergrid.tex', u'Usergrid Documentation', + u'Usergrid', 'manual' +),] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'Usergrid', u'Usergrid Documentation', + [u'Usergrid'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------------ + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'Usergrid', u'Usergrid Documentation', + u'Usergrid', 'Usergrid', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False + +#sys.path += ["."] +sys.path.insert(0, os.path.abspath('.')) +sys.path.insert(0, os.path.abspath('./lib')) +extensions += ["sphinxcontrib_markdown"] + +markdown_title = 'Apache Usergrid Documents' +source_suffix = '.md' http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/contribute-code.md ---------------------------------------------------------------------- diff --git a/docs/contribute-code.md b/docs/contribute-code.md new file mode 100644 index 0000000..7c9e600 --- /dev/null +++ b/docs/contribute-code.md @@ -0,0 +1,22 @@ +# How to Contribute Code & Docs + +Code Contributions +--- +The Usergrid project has adopted a policy for how code is to be contributed +by external contributors, and by those who are committers on the project. +You can read this policy here [Usergrid Contribution Workflow](https://cwiki.apache.org/confluence/display/apache/incubator-usergrid+Contribution+Workflow). + +Basically, we use GitHub as our code review system. So you should fork the +apache/incubator-usergrid repo and submit PRs back to the project. Here +are are step-by-step guide for both both external contributors and committers: + +* [External Contributors Guide](https://cwiki.apache.org/confluence/display/apache/incubator-usergrid+External+Contributors+Guide) +* [Usergrid Committers Guide](https://cwiki.apache.org/confluence/display/apache/incubator-usergrid+Committers+Guide) + +Website and Documentation Contributions +--- +If you want to contribute to the documentation you'll find that we use a different +system. Our website and documentation is managed in Subversion. Here's a README file +that explains how to get the website and documentation source code and make changes: + +* [README.md for website and documentation](http://svn.apache.org/viewvc/incubator/usergrid/site/README.md?view=markup) http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/deploy-local.md ---------------------------------------------------------------------- diff --git a/docs/deploy-local.md b/docs/deploy-local.md new file mode 100644 index 0000000..2fa48ea --- /dev/null +++ b/docs/deploy-local.md @@ -0,0 +1,170 @@ +# Deploying to local Tomcat & Cassandra + +This is a guide that explains how to install and run Usergrid using stock Tomcat and Cassandra on a single computer. + +NOTE: running Cassandra on a single computer is something you should do ONLY for testing purposes. You don't want to run one node in production even just to start out. To get the benefit of Cassandra's architecture, which is designed to support linear scalability. You should be running a Cassandra cluster with at least three nodes. + +For more information: + +* [Cassandra FAQ: Can I Start With a Single Node?](http://planetcassandra.org/blog/post/cassandra-faq-can-i-start-with-a-single-node/) +* [Why don't you start off with a “single & small” Cassandra server](http://stackoverflow.com/questions/18462530/why-dont-you-start-off-with-a-single-small-cassandra-server-as-you-usually) + +## Requirements + +* [JDK 1.7](http://www.oracle.com/technetwork/java/javase/downloads/index.html) +* [Maven](http://maven.apache.org/) + +## Download + +Use GitHub to clone the [apache/incubator-usergrid](https://github.com/apache/incubator-usergrid) repo. + +Or you can start by [downloading our latest code](https://github.com/apache/incubator-usergrid/archive/master.zip) and extract it. + +## Building + +From the command line, navigate to stack directory and type the following: + + mvn clean package -DskipTests=true + +Once you are done the Usergrid application will be package as a Java EE WAR file at the location __stack/rest/target/ROOT.war__. + +Install and configure Cassandra +--- + +Install Cassandra, don't edit configuration files as we just want default values for this simple setup. Here are the [instructions for installing Cassandra](http://wiki.apache.org/cassandra/GettingStarted) + +Install and configure Tomcat +--- + +Follow instructions, don't edit configuration files as we just want default values for this simple setup. Here are the [instructions for installing Tomcat 7](http://tomcat.apache.org/tomcat-7.0-doc/setup.html) + +Add Usergrid WAR to Tomcat +--- + +Remove the existing tomcat/webapps/ROOT directory. + +Place the Usergrid ROOT.war file into the tomcat/webapps directory + +Add Usergrid configuration file to Tomcat +--- + +Create a __usergrid-deployment.properties__ file and place it in Tomcat's __lib__ directory. You can find an example properties file below that should work well for a local Tomcat & Cassandra setup. You will probably only need to change the properties below to use your email address and preferred password for the install. + + + usergrid.sysadmin.login.allowed=true + usergrid.sysadmin.login.name=superuser + usergrid.sysadmin.login.password=pw123 + usergrid.sysadmin.email=me@example.com + usergrid.sysadmin.login.email=myself@example.com + usergrid.management.mailer=Myself + usergrid.test-account.admin-user.email=myself@example.com + usergrid.test-account.admin-user.password=test + +Run Usergrid Database & Super User Setup +--- + +Start Tomcat and use your web browser to visit the URLs below. While you do this you might want to watch the logs under tomcat/logs for clues, just in case anything goes wrong. + +Database setup URL - [http://localhost:8080/system/database/setup](http://localhost:8080/system/database/setup) + +When prompted to login use the sysadmin credentials that you specified in your usergrid-deployment.properties file. Based on the example above that would be superuser and pw123. If the operation is successful you should a message like the one below in your browser. If not, check your logs for clues about what went wrong. + + { + "action" : "cassandra setup", + "status" : "ok", + "timestamp" : 1379424622947, + "duration" : 76 + } + +Superuser setup URL - [http://localhost:8080/system/superuser/setup](http://localhost:8080/system/superuser/setup) + +You should not be prompted for login because you already logged into for the Database Setup. If setup works, you should see a message like this: + + { + "action" : "superuser setup", + "status" : "ok", + "timestamp" : 1379424667936, + "duration" : 2 + } + +Login to the Usergrid Console & get started +--- +You should now be able to login to the Usergrid console and start configuring applications, users and more. + +You can use an static version of the portal to get started: + +[http://apigee.github.io/usergrid-portal/?api_url=http://localhost:8080](http://apigee.github.io/usergrid-portal/?api_url=http://localhost:8080) + + +Example usergrid-deployment.properties file +--- +Here's a complete example properties file to get you started. + + # Minimal Usergrid configuration properties for local Tomcat and Cassandra + # + # The cassandra configuration options. + + # The cassandra host to use + cassandra.url=localhost:9160 + + # The strategy to use when creating the keyspace. This is the default. + # We recommend creating the keyspace with this default, then editing it + # via the cassandra CLI to meet the client's needs. + cassandra.keyspace.strategy=org.apache.cassandra.locator.SimpleStrategy + + # The default replication factor for the simple strategy. Again, leave the + # default, create the app, then use the cassandra cli to set the replication + # factor options. This can become complicated with different topologies and + # is more a Cassandra administration issue than a UG issue. + cassandra.keyspace.strategy.options.replication_factor=1 + + ###################################################### + # Custom mail transport. Not usually used for local testing + + #mail.transport.protocol=smtps + #mail.smtps.host=email-smtp.us-east-1.amazonaws.com + #mail.smtps.port=465 + #mail.smtps.auth=true + #mail.smtps.quitwait=false + #mail.smtps.username= + #mail.smtps.password= + + ###################################################### + # Admin and test user setup (change these to be their super user + + usergrid.sysadmin.login.name=superuser + usergrid.sysadmin.login.email=myself@example.com <--- Change this + usergrid.sysadmin.login.password=pw123 <--- Change this + usergrid.sysadmin.login.allowed=true + usergrid.sysadmin.email=myself@example.com <--- Change this + + # Enable or disable this to require superadmin approval of users + usergrid.sysadmin.approve.users=false + + ###################################################### + # Auto-confirm and sign-up notifications settings + + usergrid.management.admin_users_require_confirmation=false + usergrid.management.admin_users_require_activation=false + usergrid.management.organizations_require_activation=false + usergrid.management.notify_sysadmin_of_new_organizations=false + usergrid.management.notify_sysadmin_of_new_admin_users=false + + ###################################################### + # URLs + # Redirect path when request come in for TLD + + usergrid.redirect_root=https://localhost:8080/status + usergrid.view.management.organizations.organization.activate=https://localhost:8080/accounts/welcome + usergrid.view.management.organizations.organization.confirm=https://localhost:8080/accounts/welcome + usergrid.view.management.users.user.activate=https://localhost:8080/accounts/welcome + usergrid.view.management.users.user.confirm=https://localhost:8080/accounts/welcome + usergrid.organization.activation.url=https://localhost:8080/management/organizations/%s/activate + usergrid.admin.activation.url=https://localhost:8080/management/users/%s/activate + usergrid.admin.resetpw.url=https://localhost:8080/management/users/%s/resetpw + usergrid.admin.confirmation.url=https://localhost:8080/management/users/%s/confirm + usergrid.user.activation.url=https://localhost:8080%s/%s/users/%s/activate + usergrid.user.confirmation.url=https://localhost:8080/%s/%s/users/%s/confirm + usergrid.user.resetpw.url=https://localhost:8080/%s/%s/users/%s/resetpw + + \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/getting-up-and-running-locally.md ---------------------------------------------------------------------- diff --git a/docs/getting-up-and-running-locally.md b/docs/getting-up-and-running-locally.md new file mode 100644 index 0000000..ba7ffcc --- /dev/null +++ b/docs/getting-up-and-running-locally.md @@ -0,0 +1,72 @@ +# Getting Up & Running Locally + +## Requirements + +* [JDK 1.7](http://www.oracle.com/technetwork/java/javase/downloads/index.html) +* [Maven](http://maven.apache.org/) + +## Download + +### Download2 + +Start by [downloading our latest code](https://github.com/apache/incubator-usergrid/archive/master.zip) and extract it. + +#### Building 3 + +From the command line, navigate to stack directory and type the following: + + mvn clean install -DskipTests=true + +## Running + +Usergrid-core contains the persistence layer and shared utilities for powering the Usergrid service. The services layer is contained in usergrid-services and exposes a higher-level API that's used by the usergrid-rest web services tier. + +You can run Usergrid from the command-line from the +jar in the usergrid/standalone project: + + cd launcher; java -jar target/usergrid-launcher-*.jar + +After startup, your instance will be available on localhost, port 8080. +To check it’s running properly, you can try loading our status page: + + curl http://localhost:8080/status + +You can also run it as a webapp in Tomcat, by deploying the ROOT.war file generated in the usergrid/rest project. + +## Getting Started with the HTTP API + +Start by creating an Organization. It’s the top-level structure in Usergrid: +all Apps and Administrators must belong to an Organization. Here’s how you create one: + + curl -X POST \ + -d 'organization=myfirstorg&username=myadmin&name=Admin&email=admin@example.com&password=password' \ + http://localhost:8080/management/organizations + +You can see that creating an Organization creates an Administrator in the process. Let’s authenticate as him: + + curl 'http://localhost:8080/management/token?grant_type=password&username=myadmin&password=password' + +This will return an access\_token. We’ll use this to authenticate the next two calls. +Next, let’s create an Application: + + curl -H "Authorization: Bearer [the management token from above]" \ + -H "Content-Type: application/json" \ + -X POST -d '{ "name":"myapp" }' \ + http://localhost:8080/management/orgs/myfirstorg/apps + +… And a User for the Application: + + curl -H "Authorization: Bearer [the management token from above]" \ + -X POST "http://localhost:8080/myfirstorg/myapp/users" \ + -d '{ "username":"myuser", "password":"mypassword", "email":"user@example.com" }' + +Let’s now generate an access token for this Application User: + + curl 'http://localhost:8080/myfirstorg/myapp/token?grant_type=password&username=myuser&password=mypassword' + +This will also send back an access\_token, but limited in scope. +Let’s use it to create a collection with some data in it: + + curl -H "Authorization: Bearer [the user token]" \ + -X POST -d '[ { "cat":"fluffy" }, { "fish": { "gold":2, "oscar":1 } } ]' \ + http://localhost:8080/myfirstorg/myapp/pets http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/index.md ---------------------------------------------------------------------- diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..49e7164 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,11 @@ +*************** +Apache Usergrid Documents +*************** + +.. toctree:: + deploy-local + getting-up-and-running-locally + organizations-admins + presentations-and-videos + upgrading + contribute-code \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/lib/sphinxcontrib_markdown.py ---------------------------------------------------------------------- diff --git a/docs/lib/sphinxcontrib_markdown.py b/docs/lib/sphinxcontrib_markdown.py new file mode 100644 index 0000000..cf2aeb3 --- /dev/null +++ b/docs/lib/sphinxcontrib_markdown.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +""" + sphinxcontrib_markdown + ~~~~~~~~~~~~~~~~~~~~~~~ + + :copyright: Copyright 2012 by Takeshi Komiya. + :license: BSDL. +""" + +import os +from tempfile import mkstemp + +class MarkdownProcessor(object): + def on_builder_inited(self, app): + orig_find_files = app.env.find_files + + def find_files(config): + orig_find_files(config) + app.env.found_docs.add('index') + + app.env.find_files = find_files + + def on_env_purge_doc(self, app, env, docname): + env.find_files = None + del env.find_files + + def on_source_read(self, app, docname, source): + docs = ['index', 'organizations-admins', 'presentations-and-videos'] + for doc in docs: + if docname == doc: + return + + try: + input = mkstemp() + output = mkstemp() + os.close(input[0]) + os.close(output[0]) + + with open(input[1], 'wt') as f: + f.write(source[0].encode('utf-8')) + + cmdline = "pandoc -r markdown -w rst %s -o %s" % (input[1], output[1]) + #print cmdline + os.system(cmdline) + source[0] = open(output[1]).read().decode('utf-8') + finally: + os.unlink(input[1]) + os.unlink(output[1]) + + def setup(self, app): + app.add_config_value('markdown_title', None, 'html') + app.connect('builder-inited', self.on_builder_inited) + app.connect('env-purge-doc', self.on_env_purge_doc) + app.connect('source-read', self.on_source_read) + +def setup(app): + md = MarkdownProcessor() + md.setup(app) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/make.bat ---------------------------------------------------------------------- diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..05d2459 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=target +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\recopick.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\recopick.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/organizations-admins.md ---------------------------------------------------------------------- diff --git a/docs/organizations-admins.md b/docs/organizations-admins.md new file mode 100644 index 0000000..bbe6443 --- /dev/null +++ b/docs/organizations-admins.md @@ -0,0 +1,44 @@ +Organizations & Admins +================================================== + +.. toctree:: + concepts/applications + concepts/events-and-counters + concepts/roles-and-permissions + concepts/relationships + concepts/collections + concepts/query-language + concepts/users-devices + concepts/groups + concepts/activity + concepts/assets + +###### Organizations + +An organization represents the highest level of the Apache Usergrid data +hierarchy. It contains applications (and the entities and collections +they contain) and is associated with one or more administrators. An +organization can be representative of a company, team, or project. It +allows multiple applications  to be shared within the organization with +other administrators. + + +Property Type Description +--------------------------------------- --------- --------------------------------------------------------------------- +uuid UUID Organization’s unique entity ID +type string "organization" +created long [UNIX timestamp](http://en.wikipedia.org/wiki/Unix_time) of entity creation +modified long [UNIX timestamp](http://en.wikipedia.org/wiki/Unix_time) of entity modification +organization string The name of the organization. +username string The username of the administrator. +name string The name of the administrator. +email string The email address of the administrator. +password string The password of the administrator. (create-only) + +###### Admins + +An admin user has full access to perform any operation on all +organization accounts of which the admin user is a member. Using the App +services API, you can create, update, or retrieve an admin user. You can +also set or reset an admin user's password, activite or reactivate an +admin user, and get an admin user's activity feed. \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/presentations-and-videos.md ---------------------------------------------------------------------- diff --git a/docs/presentations-and-videos.md b/docs/presentations-and-videos.md new file mode 100644 index 0000000..84ea3db --- /dev/null +++ b/docs/presentations-and-videos.md @@ -0,0 +1,7 @@ +*************** +Presentations & Videos +*************** + +.. toctree:: + presentations-and-videos/presentations + presentations-and-videos/videos \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/presentations-and-videos/presentations.md ---------------------------------------------------------------------- diff --git a/docs/presentations-and-videos/presentations.md b/docs/presentations-and-videos/presentations.md new file mode 100644 index 0000000..76c2a46 --- /dev/null +++ b/docs/presentations-and-videos/presentations.md @@ -0,0 +1,21 @@ +# Presentations + +## How to Contribute to Apache Usergrid +- David Johnson, [ApacheCon NA 2014](http://apacheconnorthamerica2014.sched.org/event/29971aabd3c86398be2ae93403c7d1d2) + + + +## Apache Usergrid Internals +- Sungju Jin + + + +## Open Source Mobile Backend on Cassandra +- Ed Anuff + + + +## Usergrid Overview +- Ed Anuff + + \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/presentations-and-videos/videos.md ---------------------------------------------------------------------- diff --git a/docs/presentations-and-videos/videos.md b/docs/presentations-and-videos/videos.md new file mode 100644 index 0000000..bc814f5 --- /dev/null +++ b/docs/presentations-and-videos/videos.md @@ -0,0 +1,11 @@ +# Videos + +## How to Contribute to Apache Usergrid +- David Johnson, [ApacheCon NA 2014](http://apacheconnorthamerica2014.sched.org/event/29971aabd3c86398be2ae93403c7d1d2) + + + +## C* 2012: Cassandra at Apigee: Usergrid Powering Mobile +- Ed Anuff + + \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5ba3b73f/docs/upgrading.md ---------------------------------------------------------------------- diff --git a/docs/upgrading.md b/docs/upgrading.md new file mode 100644 index 0000000..0df0935 --- /dev/null +++ b/docs/upgrading.md @@ -0,0 +1,3 @@ +# Upgrading from Previous Versions + +If you built and used a previous version of Usergrid, that may be using a different schema, we have an easy built-in tool to audit your Cassandra column family structure and upgrade the dataset as necessary. Once you have pulled, built and launched the new version of Usergrid, just hit [http://localhost:8080/system/database/setup](http://localhost:8080/system/database/setup) to run the upgrade tool. \ No newline at end of file