<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:content="http://purl.org/rss/1.0/modules/content/">

	<channel>

	<title>Fellowship One &#45; Developer Community RSS Feed</title>
	<link>http://developer.fellowshipone.com/index.php/site/index/</link>
	<description>Fellowship One RESTful API is a REST based web application that uses several open protocols and patterns to provide consumers access to secure resources. STANDARDS, PROTOCOLS, and PATTERNS - nothing else. As developers we see where there is major value in sticking with something that is "tried and true." If we could use web based patterns and protocols for a web based API we could not only get instant adoption but gain the efficiencies and effectiveness of technologies that "just work."</description>
	<dc:language>en</dc:language>
	<dc:creator>tracy.mazelin@activenetwork.com</dc:creator>
	<dc:rights>Copyright 2012</dc:rights>
	<dc:date>2012-04-24T20:03:56+00:00</dc:date>
	<admin:generatorAgent rdf:resource="http://expressionengine.com/" />


	<item>
		<title>Resource Versioning</title>
		<link>https://developer.fellowshipone.com/index.php/blog/resource_versioning/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/resource_versioning/#When:21:03:56Z</guid>
		<description>Enhanced Functionality without breaking Compatibility
We&#8217;re excited to announce a few changes coming to the API! If you have been following along with the Community Blog, you will be aware of the initiative to streamline communication values. If not take a look at the posts here and here. It follows that these changes will be reflected through the API also.&amp;nbsp; As part of this effort, the &amp;quot;listed&amp;quot; functionality around each communication resource will soon be discontinued as well as the node being removed. Instead, we will be adding a new node to the people resource called &amp;quot;unsubscribed&amp;quot;. 
Currently, the &amp;quot;listed&amp;quot; node is returned with each communication resource as follows:
[GET] https://demo.fellowshiponeapi.com/v1/Households/1552366/Communications.json
Response:
...
&quot;communicationType&quot;:{
&quot;@id&quot;:&quot;1&quot;,
&quot;@uri&quot;:&quot;https://demo.fellowshiponeapi.com/v1/Communications/CommunicationTypes/1&quot;,
&quot;name&quot;:&quot;Home Phone&quot;
},
&quot;communicationGeneralType&quot;:&quot;Telephone&quot;,
&quot;communicationValue&quot;:&quot;214&#45;759&#45;2756&quot;,
&quot;searchCommunicationValue&quot;:&quot;2147592756&quot;,
&quot;listed&quot;:&quot;true&quot;,
&quot;communicationComment&quot;:null,
&quot;createdDate&quot;:&quot;2005&#45;01&#45;20T01:04:55&quot;,
&quot;lastUpdatedDate&quot;:&quot;2005&#45;01&#45;20T01:04:55&quot;
...

In 30&#45;45 days, this node will be removed. If you are using the API to retrieve or create communication resources, you will want to make sure you are using the correct data model. It is always a good idea to call NEW before CREATE. See the Ten Commandments of API Consumption here.
The new &amp;quot;unsubscribed&amp;quot; node will be added on the people resource level for the xml or json being returned or received and this resource will be versioned.
HATEOAS
HATEOAS, is the abbreviation for Hypermedia as the Engine of Application State and it is a  constraint of the REST architecture. It serves to decouple the client and server in a way that allows the server to evolve functionality without breaking compatibility. In consistency with this constraint, we are creating a new content&#45;type so that existing users will not be impacted by this functionality enhancement. To use version two of the people resource with the new &#8220;unsubscribed&#8221; node, you will need to pass in a custom content&#45;type:
Content&#45;Type: application/vnd.fellowshiponeapi.com.people.people.v2+xml
or
Content&#45;Type: application/vnd.fellowshiponeapi.com.people.people.v2+json
Example
Given:
[GET] http://demo.fellowshiponeapi.com/v1/Households/1999107/People
Content&#45;Type: application/vnd.fellowshiponeapi.com.people.people.v2+json
Response:

&quot;people&quot;: {
  &quot;person&quot;: [
    {
		&quot;@array&quot;: &quot;true&quot;,
		&quot;@id&quot;: &quot;8711560&quot;,		&quot;@uri&quot;: &quot;http://demo.fellowshiponeapi.com/v1/People/8711560&quot;,
		...
		&quot;firstRecord&quot;: &quot;2006&#45;02&#45;03T11:27:40&quot;,
		&quot;lastMatchDate&quot;: null,
		&quot;unsubscribed:&quot; false,
		&quot;createdDate&quot;: &quot;2006&#45;02&#45;03T11:27:40&quot;,		...
Versioning of this resource is currently live in production &#45; give it a try!
Reduction of Communication Types
Given:
[GET] https://demo.fellowshiponeapi.com/v1/Communications/CommunicationTypes
Returns a list of communication types. Following the completion of the reduction of communication types project, the following communication types will no longer be returned by the API:
For a Household: 
Alternate Phone; Alternate Email; Children Phone; CR Safe Phone; Emergency Phone; Fax; Mobile; Pager; Previous Phone; School Phone; School Email;Vacation Phone; Work Phone; Work Email.
For an Individual: 
 Alternate Phone; Alternate Email; Children Phone; CR Safe Phone; Fax; Pager; Previous Phone; School; Phone; School Email; Vacation Phone; Work Email.
Attempting to request any of these specific CommunicationType resources in the current version will return an HTTP 404 &#45; Not Found.
Please let us know if you have any questions and as always, thank you for being part of the Fellowship One Developer Community!</description>
		<dc:subject>API</dc:subject>
		<dc:date>2012-04-24T21:03:56+00:00</dc:date>
	</item>

	<item>
		<title>Enter Visitor Data via Your Church Website</title>
		<link>https://developer.fellowshipone.com/index.php/blog/enter_visitors_into_fellowship_one_through_your_church_website/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/enter_visitors_into_fellowship_one_through_your_church_website/#When:14:49:39Z</guid>
		<description>Possibilities For Ministry Use

 Capture contact information dynamically during a worship service instead of using visitor cards
Allow volunteers to enter simple data into Fellowship One through your church website
Setup a kiosk where visitors can enter their own contact information


The Code
The following is the PHP code used to process the form entries and write the data into Fellowship One through the API.&amp;nbsp; This example uses the PHP Helper Class, &#8216;FellowshipOne.php&#8217; contributed by a member of our developer community, Daniel Boorn.&amp;nbsp; A few methods were added to the helper class and you will find a link to all the source code below this code example.&amp;nbsp; Please feel free to use and adapt this as necessary.&amp;nbsp; If you don&#8217;t already have an API key, you can apply for one here: https://developer.fellowshipone.com/index.php/key


&amp;lt;?php
require(&#39;FellowshipOne.php&#39;);

	$settings = array(
		&#39;key&#39;=&gt;&#39;your key here&#39;,
		&#39;secret&#39;=&gt;&#39;your secret here&#39;,
		&#39;username&#39;=&gt;&#39;portal username here &#45; must be linked to a person in f1&#39;,
		&#39;password&#39;=&gt;&#39;password&#39;,
		&#39;baseUrl&#39;=&gt;&#39;https://yourchurchcode.fellowshiponeapi.com&#39;,
		&#39;debug&#39;=&gt;true,
	);
	
	//instantiate the f1 class	
	$f1 = new FellowshipOne($settings);
		if(($r = $f1&#45;&gt;login()) === false){
		die(&quot;Failed to login&quot;);
	}
	
	//Get F1 Household json model	
	$model = $f1&#45;&gt;householdModel;
	
	//Update model with form info	
	$model[&#39;household&#39;][&#39;householdName&#39;] = $_POST[&#39;firstName&#39;].&#39; &#39;.$_POST[&#39;lastName&#39;];
	$model[&#39;household&#39;][&#39;householdSortName&#39;] = $_POST[&#39;lastName&#39;];
	$model[&#39;household&#39;][&#39;householdFirstName&#39;] = $_POST[&#39;firstName&#39;];
	
	//Create Household in F1	
         $results = $f1&#45;&gt;createHousehold($model);
		
	//Create a person in the household we just created		
	//First determine household position
			
	$householdPosition = $_POST[&#39;householdPosition&#39;];
	
	if($householdPosition == &quot;Head&quot;){
		$householdMemberType = &quot;1&quot;;
		} elseif($householdPosition == &quot;Spouse&quot;){
			$householdMemberType = &quot;2&quot;;
			} else {
				$householdMemberType = &quot;3&quot;;
				}
	
	$today = new DateTime(&#39;now&#39;);
	
	//Get the F1 Person json model	
        $model = $f1&#45;&gt;personModel;
	
	//Update the person model with the form info	
	$model[&#39;person&#39;][&#39;@householdID&#39;] = $results[&#39;household&#39;][&#39;@id&#39;]; 
	$model[&#39;person&#39;][&#39;firstName&#39;] = $_POST[&#39;firstName&#39;];
	$model[&#39;person&#39;][&#39;lastName&#39;] = $_POST[&#39;lastName&#39;];
	$model[&#39;person&#39;][&#39;gender&#39;] = $_POST[&#39;gender&#39;];
	$model[&#39;person&#39;][&#39;dateOfBirth&#39;] = date(DATE_ATOM,mktime(0,0,0,$_POST[&#39;month&#39;],$_POST[&#39;day&#39;],$_POST[&#39;year&#39;]));	
	$model[&#39;person&#39;][&#39;maritalStatus&#39;] = $_POST[&#39;maritalStatus&#39;];
	$model[&#39;person&#39;][&#39;householdMemberType&#39;][&#39;@id&#39;] = $householdMemberType;
	$model[&#39;person&#39;][&#39;householdMemberType&#39;][&#39;name&#39;] = $householdPosition;
	$model[&#39;person&#39;][&#39;status&#39;][&#39;@id&#39;] = &#39;110&#39;; // example
	$model[&#39;person&#39;][&#39;status&#39;][&#39;date&#39;] = $today&#45;&gt;format(DATE_ATOM);
	
	
	//Write the person in the household into F1	
       $r = $f1&#45;&gt;createPerson($model);
	
	//Store the personID
	$personID = $r[&#39;person&#39;][&#39;@id&#39;];
	
	//get the communications json model from F1
	$model = $f1&#45;&gt;getCommunicationModel($personID);
	
	//Update the json model with the email address
	$model[&#39;communication&#39;][&#39;communicationType&#39;][&#39;@id&#39;] = &quot;4&quot;;
	$model[&#39;communication&#39;][&#39;communicationType&#39;][&#39;name&#39;] = &quot;email&quot;;
	$model[&#39;communication&#39;][&#39;communicationValue&#39;] = $_POST[&#39;email&#39;];
	
	//Write the email communication into F1
	$r = $f1&#45;&gt;createCommunication($model, $personID);
	
	//Update the json model with the telephone info
	$model[&#39;communication&#39;][&#39;communicationType&#39;][&#39;@id&#39;] = &quot;1&quot;;
	$model[&#39;communication&#39;][&#39;communicationType&#39;][&#39;name&#39;] = &quot;telephone&quot;;
	$model[&#39;communication&#39;][&#39;communicationValue&#39;] = $_POST[&#39;primaryPhone&#39;];
	
	//Write the telephone value into F1
	$r = $f1&#45;&gt;createCommunication($model, $personID);
		
	//Check if a file was uploaded and move it out of the temp directory then write it to F1

	if ($_FILES[&#39;image&#39;][&#39;name&#39;]){
		define(&#39;UPLOAD_DIR&#39;, &#39;/path/to/directory/&#39;);
		move_uploaded_file($_FILES[&#39;image&#39;][&#39;tmp_name&#39;], UPLOAD_DIR.$_FILES[&#39;image&#39;][&#39;name&#39;]);
		$imageStr = file_get_contents(UPLOAD_DIR.$_FILES[&#39;image&#39;][&#39;name&#39;]);
		$r = $f1&#45;&gt;createImage($imageStr, $personID);
	}	
?&amp;gt;


All Source Code
https://github.com/tracymazelin/F1&#45;Guest&#45;Entry

&amp;nbsp;</description>
		<dc:subject>API, Tips</dc:subject>
		<dc:date>2012-03-16T14:49:39+00:00</dc:date>
	</item>

	<item>
		<title>Fellowship One &amp;amp; Planning Center Online</title>
		<link>https://developer.fellowshipone.com/index.php/blog/fellowship_one_planning_center_online_mash-up/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/fellowship_one_planning_center_online_mash-up/#When:16:31:27Z</guid>
		<description>How to Fork, Host, Deploy and Contribute to this open source project
It is now possible to sync your Fellowship One people demographic data to your Planning Center Online Account via an open source application that utilizes both the Fellowship One API and the Planning Center Online API.&amp;nbsp; This blog post is going to walk you through the process of setting up and hosting this application.

What you will need:
&amp;nbsp; An account on github (free)
&amp;nbsp; An account on a fully hosted .NET platform as a service such as AppHarbor (free)
&amp;nbsp; Microsoft SQL Server Management Studio (free)
&amp;nbsp; Consumer Key and Secret from F1 (apply here)
&amp;nbsp; Consumer Key and Secret from Planning Center (apply here)

Step 1: Fork the Repo and make a local clone
In order to contribute to another developers project or use their project as a starting point for your own, you will need to fork the repo.&amp;nbsp; This is done by simply clicking fork on this page https://github.com/fellowshiptech/f1&#45;pco:

Once you have done this, you will need to clone a copy of the code to your local machine.&amp;nbsp; Instructions for doing this can be found here: http://help.github.com/fork&#45;a&#45;repo/
Step 2: Setup your application in AppHarbor
Since this is an ASP.NET MVC application, you will need the appropriate server environment in which to deploy the application.&amp;nbsp; AppHarbor is a fully hosted .NET Platform as a Service solution, which allows you to deploy any standard .NET application.&amp;nbsp; They offer a free account with ample resources for a project like this.&amp;nbsp; Sign up here: https://appharbor.com/
Once you have created your account, you will need to create a new application:

Step 3: Install the Free SQL Server Add&#45;on
Installing an MS SQL Server is necessary to run this application.&amp;nbsp; AppHarbor offers a free add&#45;on for a shared SQL Server instance.&amp;nbsp; Select the &#8220;Yocto&#8221; version and click &#8220;Install&#8221;.

Step 4: Use MS SQL Management Studio to connect to Database
Once you have installed the SQL server, AppHarbor will assign a user id and password to access it.&amp;nbsp; This can be found by clicking the Go to &#8220;SQL Server&#8221; link found on your SQL Server page in AppHarbor.&amp;nbsp; You will need the following information:

&amp;nbsp;  Connection String (save for step 6)
&amp;nbsp;  Host
&amp;nbsp;  Username
&amp;nbsp;  Password

Now you will need to open up SQL Management Studio and enter these credentials here, using the &#8220;Host&#8221; string as the &#8220;Server Name&#8221; and entering the Login and Password information:

Step 5: Run Database Script
Upon successful connection to the SQL server, you will need to run the database script provided in the repo: Scripts/DBScript.sql.&amp;nbsp; Select File &#45;&gt; Open &#45;&gt; Locate Script &#45;&gt; Execute.
Step 6: Edit web.config
Open up the web.config file and enter the following information:
&amp;nbsp;  Connection String (from step 4)
&amp;nbsp;  F1Consumer Key
&amp;nbsp;  F1Consumer Secret
&amp;nbsp;  PCO Consumer Key
&amp;nbsp;  PCO Consumer Secret

Step 7: Deploy Application to AppHarbor
The last thing you need to do is push the local repository to your AppHarbor Repository URL.&amp;nbsp; Doing so will trigger the build on AppHarbor.&amp;nbsp; You will need to get the AppHarbor Repository URL.&amp;nbsp; Add the remote repository like this:
git remote add appharbor MY_REPOSITORY_URL
Deploy using:
git push appharbor master
That&#8217;s it!&amp;nbsp; Your integration between the two applications is now complete.&amp;nbsp; By offering this open source code, our hope is that you will contribute back to this project by adding features and functionality.&amp;nbsp; It is important to note that this is currently setup for one&#45;way syncing only.&amp;nbsp; The direction is Fellowship One to PCO.&amp;nbsp; Developing multi&#45;directional syncing capabilities would be a great way to enhance this project!&amp;nbsp; Also, the application has multi&#45;tenant functionality built in.&amp;nbsp; If you use this as a single solution for your church, you may want to remove the multi&#45;tenant functionality (requesting church code etc.) and set it up as a 2nd party application.
We hope you find this useful and look forward to hearing about the awesome ways you build upon this framework for enhancing integration between Fellowship One and Planning Center Online!</description>
		<dc:subject>API</dc:subject>
		<dc:date>2012-03-01T16:31:27+00:00</dc:date>
	</item>

	<item>
		<title>API Libraries and Sample Code</title>
		<link>https://developer.fellowshipone.com/index.php/blog/api_libraries_and_sample_code/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/api_libraries_and_sample_code/#When:15:07:08Z</guid>
		<description>Code libraries make it easier for you to use the Fellowship One API in the language or framework of your choice.&amp;nbsp; We have compiled a list of code libraries along with some sample code to help get you started with your API project.&amp;nbsp; We are thankful to numerous members of our developer community for being willing to contribute their work to help others get their projects off the ground.&amp;nbsp; If you have developed your own library, or you have any code examples you would be willing to share, please .&amp;nbsp; We would love to add your work to the list.&amp;nbsp; Check out the library here:

https://developer.fellowshipone.com/libraries

Tracy Mazelin is the newest member of the API Developer Team at Fellowship Technologies (part of Active Network).&amp;nbsp; She is passionate about evangelizing the API and giving users the tools they need to take them to the next level of API utilization.</description>
		<dc:subject>API</dc:subject>
		<dc:date>2012-02-07T15:07:08+00:00</dc:date>
	</item>

	<item>
		<title>Building a custom login for your church website using the API</title>
		<link>https://developer.fellowshipone.com/index.php/blog/building_a_custom_login_for_your_church_website_using_the_api/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/building_a_custom_login_for_your_church_website_using_the_api/#When:20:04:48Z</guid>
		<description>Background
The Application Programming Interface (API) of Fellowship One provides a way for churches to leverage their own church data within custom built applications. This tutorial is going to outline how you can use our API to build a custom login to your church website by authorizing the user based on their WebLink or InFellowship login credentials. This is a 2nd party application and this post builds upon the foundation laid by Jas Singh here. You will find links to the PHP oAuth library and more detail about 2nd party authorization in his post.
Step 1: Build a login form
 
First, you will need to build a login form requesting a username and password. If the majority of your church has already converted their WebLink login to an InFellowship login, then you will want to ask for their email address as their username. The authentication is designed to accept either a WebLink or InFellowship username.
Here is an example of the code you would need to use to collect the username and password and also print a login failure message if the credentials submitted do not match what is in your Fellowship One database:
&amp;lt;form action=&amp;quot;authenticate.php&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;  &amp;lt;p&amp;gt;    &amp;lt;?php if(isset($_GET[&#39;login&#39;]) &amp;amp;&amp;amp; $_GET[&#39;login&#39;] == &amp;quot;failed&amp;quot;)        echo &#39;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Incorrect Username or Password&amp;lt;/span&amp;gt;&#39;;?&amp;gt;    &amp;lt;label for=&amp;quot;username&amp;quot;&amp;gt;Username or Email Address:&amp;lt;/label&amp;gt;    &amp;lt;input name=&amp;quot;username&amp;quot; type=&amp;quot;text&amp;quot; size=&amp;quot;20&amp;quot;/&amp;gt;  &amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;    &amp;lt;label for=&amp;quot;password&amp;quot;&amp;gt;Password:&amp;lt;/label&amp;gt;    &amp;lt;input name=&amp;quot;password&amp;quot; type=&amp;quot;password&amp;quot; size=&amp;quot;20&amp;quot; /&amp;gt;    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Log In&amp;quot; name=&amp;quot;submit&amp;quot; /&amp;gt;    &amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;redirect&amp;quot; value=&amp;quot;&amp;lt;?php echo $_GET[&#39;redirect&#39;]?&amp;gt;&amp;quot;/&amp;gt;  &amp;lt;/p&amp;gt;  &amp;lt;p&amp;gt;
    &amp;lt;a href=&amp;quot;https://integration.fellowshipone.com/integration/Conversion/Create.aspx?    cCode=[YourChurchCode]&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;Create Account&amp;lt;/a&amp;gt; | 
    &amp;lt;a href=&amp;quot;https://integration.fellowshipone.com/integration/loginhelp.aspx?
    cCode=[YourChurchCode]&amp;quot;&amp;gt;Forgot Password?&amp;lt;br /&amp;gt;    &amp;lt;/a&amp;gt;
  &amp;lt;/p&amp;gt;&amp;lt;/form&amp;gt;
Step 2: Process the submission
Once the user enters login credentials and clicks submit, a form action is required. This is where your church website will need to talk to Fellowship One to see if this user exists and if the credentials are correct. This will be done through the API. As part of the authentication process for accessing protected resources, the API needs the username and password separated by a space and base64 &amp;amp; URL encoded. Below is an example script in PHP for submitting the username and password to the API and collecting key user information for use in your own church website. See comments in the code for explanations:
&amp;lt;?php
  //Get these files from the PHP oAuth library
  require_once &#39;OAuth/AppConfig.php&#39;;
  require_once &#39;OAuth/OAuthClient.php&#39;;
  // Create a session
  session_start();
  $results = array();
  //Create an instance of oAuthClient
  $apiConsumer = new OAuthClient(AppConfig::$base_url, AppConfig::$consumer_key, AppConfig::$consumer_secret);
  //Post the username and password collected on the login page to the request to get an access token
  if(isset($_POST[&amp;quot;submit&amp;quot;]))  {  if($apiConsumer&#45;&amp;gt;getAccessToken2ndParty($_POST[&#39;username&#39;],$_POST[&#39;password&#39;]))
  //Get the token and token secret and store them in cookies
  {   $_SESSION[&#39;token&#39;] = $apiConsumer&#45;&amp;gt;getToken();   $_SESSION[&#39;tokenSecret&#39;] = $apiConsumer&#45;&amp;gt;getTokenSecret();   }  else  {  session_destroy();
  $_SESSION = array();
  //If the tokens are not given, the authentication failed.
  //The login form reads the redirect url and displays a login failure message
  header(&#39;Location:../login.php?login=failed&#39;);
  exit();  }
  //Upon successful authentication, the server will send back a response   //We want to get the person location from the response 
  $responseHeaders = $apiConsumer&#45;&amp;gt;getResponseHeader();
  foreach ($responseHeaders as $val) {
    $start = &#39;Content&#45;Location:&#39;;
    $contentLocation =  substr( $val, 0, 17 );
      if ($contentLocation == $start) {
      $personLocation = str_replace($start, &amp;quot;&amp;quot;, $val);
        if( $contentLocation == $start ) {
          $personLocation = str_replace($start, &amp;quot;&amp;quot;, $val); 
          $_SESSION[&#39;personurl&#39;] = trim($personLocation); 
          }
       }
     }
   } 
  //if no username or password was entered see if there is already a session
  else if (isset($_SESSION[&#39;token&#39;]))
  {
  //Initialize the Access Token.  
  $apiConsumer&#45;&amp;gt;initAccessToken($_SESSION[&#39;token&#39;],$_SESSION[&#39;tokenSecret&#39;]);
  }
  // if no credentials and no existing session redirect to login page
  else 
  {
  header(&amp;quot;Location:login.php&amp;quot;);
  exit();
  }
  $url = $_SESSION[&#39;personurl&#39;].&amp;quot;.json&amp;quot;;
  //We want to get some fields from the API and store them in cookies for use within our site
  $person=$apiConsumer&#45;&amp;gt;dorequest($url);
  $results = json_decode(strstr($person, &#39;{&amp;quot;person&amp;quot;:{&#39;), true);
  $_SESSION[&#39;iCode&#39;] = $results[&#39;person&#39;][&#39;@iCode&#39;];
  $_SESSION[&#39;firstName&#39;] = $results[&#39;person&#39;][&#39;firstName&#39;];
  $_SESSION[&#39;lastName&#39;] = $results[&#39;person&#39;][&#39;lastName&#39;];
  $_SESSION[&#39;personID&#39;] = $results[&#39;person&#39;][&#39;@id&#39;];  
  //Another call to get address information  $resource = AppConfig::$f1_people_address;  $f1_people_address = str_replace(&#39;{personID}&#39;, $_SESSION[&#39;personID&#39;], $resource);  $url = AppConfig::$base_url.$f1_people_address.&amp;quot;.json&amp;quot;;  $addresses=$apiConsumer&#45;&amp;gt;dorequest($url);  $addresses=json_decode(strstr($addresses, &#39;{&amp;quot;addresses&amp;quot;:{&amp;quot;address&amp;quot;:[{&#39;));
  $_SESSION[&#39;address1&#39;] = $addresses&#45;&amp;gt;addresses&#45;&amp;gt;address[0]&#45;&amp;gt;address1;
  $_SESSION[&#39;address2&#39;] = $addresses&#45;&amp;gt;addresses&#45;&amp;gt;address[0]&#45;&amp;gt;address2;
  $_SESSION[&#39;address3&#39;] = $addresses&#45;&amp;gt;addresses&#45;&amp;gt;address[0]&#45;&amp;gt;address3;
  $_SESSION[&#39;city&#39;] = $addresses&#45;&amp;gt;addresses&#45;&amp;gt;address[0]&#45;&amp;gt;city;
  $_SESSION[&#39;stProvince&#39;] = $addresses&#45;&amp;gt;addresses&#45;&amp;gt;address[0]&#45;&amp;gt;stProvince;
  $_SESSION[&#39;postalCode&#39;] = $addresses&#45;&amp;gt;addresses&#45;&amp;gt;address[0]&#45;&amp;gt;postalCode;  //Store other commonly used fields here
  
  //Take the user to the members area of your website.  Put your own path to the members page here
  header(&amp;quot;Location:members.php&amp;quot;);
  ?&amp;gt;
Step 3: Add this code to your OAuthClient.php file

public function getAccessToken2ndParty($username, $password) {   
    
    	 curl_setopt( $this&#45;&gt;connection, CURLOPT_NOBODY, true );
        //register a callback function which will process the response headers
        curl_setopt($this&#45;&gt;connection, CURLOPT_HEADERFUNCTION, array(&amp;amp;$this,&#39;readHeader&#39;));
    
    	$requestURL =  sprintf( &quot;%s%s&quot;, $this&#45;&gt;baseUrl, $this&#45;&gt;accesstoken_path );
		// SET the username and password
		$requestBody = Util::urlencode_rfc3986(base64_encode( sprintf( &quot;%s %s&quot;, $username, $password)));
		$getContentType = array(&quot;Accept: application/json&quot;,  &quot;Content&#45;type: application/json&quot;);
		$requestBody	= $this&#45;&gt;postRequest($requestURL, $requestBody , $getContentType,  200);
		preg_match( &quot;~oauth_token=([^&amp;amp;]+)&amp;amp;oauth_token_secret=([^&amp;amp;]+)~i&quot;, $requestBody, $tokens );
		if( !isset( $tokens[1] ) || !isset( $tokens[2] ) ) {
            return false;
        }

        $this&#45;&gt;requestToken = $tokens[1] ;
        $this&#45;&gt;tokenSecret = $tokens[2] ;

        return true;
	}

Step 4: Send the logged&#45;in user to a member area
Once authentication is complete and key fields are stored, the script redirects the user to a private area of the church website. You now have key data from the api and can easily make calls to retrieve other resources.
Step 5: Build your own integration applications!
As you can see, the API provides churches with an extra layer of intelligence behind the church website and eliminates the need to store any data in a separate web based database. Single sign on is just the beginning of the functionality afforded to churches. Using the API, it is possible to replace numerous aspects of WebLink/InFellowship with custom built applications which remain consistent with the look and feel of  the church website.</description>
		<dc:subject>API, Tips</dc:subject>
		<dc:date>2011-11-29T20:04:48+00:00</dc:date>
	</item>

	<item>
		<title>Roll Foward!</title>
		<link>https://developer.fellowshipone.com/index.php/blog/roll_foward/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/roll_foward/#When:19:06:06Z</guid>
		<description>If you are in software development or technical operations of any kind, you are probably familiar with the term &#8220;Roll Back&#8221;. For those of you who are not in either camp mentioned above, allow me to provide a brief definition:

Rollback: To return the system, software, or database to some previous state (hopefully the state prior to your deployment).

Back in August of 2010, our teams at Fellowship Technologies started on the long road to continuous delivery. Continuous delivery is the notion that you engineer your software to allow for a continuous deployment through all environments, up to and including Production (with little to no manual intervention). It is also the notion that your engineering practices are so solid that each change you make to the system is backed by a series of automated tests written by the development team. This of course provides confidence and empowers them to make changes to those creaky parts of the system that no one &#8220;used to&#8221; want to touch. 

In the past, our releases were huge chunks of software that required multiple levels of manual testing which of course took an in&#45;ordinate amount of time and actually distracted us from obtaining the real goal; getting our software from our developer&#8217;s machine to Production once it is deemed &#8220;done&#8221; by the team. Our releases were flat out painful and we knew that we had to change. During our long &#8220;mock deployment&#8221; meetings, inevitably, we would discuss the infamous roll&#45;back strategy. This strategy exists simply due to the low confidence of your team in their ability to deliver software. That confidence could stem from their own engineering practices to the actual environment or platform that they were deploying to. At any rate, the team owns those challenges and our teams set out on a course to remove the reasons that it so painful to deliver software.

We practice Scrum as our framework for software development. Scrum&#8217;s job is to show our teams why we can&#8217;t obtain our goal mentioned above. Scrum was doing its job well and our team finally decided that it was time to focus on this problem. I think we could all agree as a team that we are no where near where we want to be, but that is what excites me about our teams. They have the drive to get better. While it never happens as quickly as we all would like, we learn each step how to do something better and apply that to the next challenge. Scrum is empirical in nature, meaning that we learn from observation and experience. Today (Aug 9) is our 1 year anniversary to the turning point in our engineering practices. This post is to celebrate all of the team&#8217;s accomplishments over the year. I am so grateful to be a part of a team that embraces continuous improvement and at the heart of our decisions has the desire to serve our customers as best we can.

The path has been no bed of roses; no pleasure cruise. We have had our challenges, dis&#45;agreements, and flat out failures (learning opportunities). However, I can say that I believe our confidence factor has improved by a factor of 10. Our teams are not afraid of any challenges nor do they shy away from those large &#8220;learning opportunities&#8221;. We continually improve in our ability to work as a team and learn to navigate the mine field of doing things the right way and doing what is best for our customers. In the end, we have removed the term &#8220;roll&#45;back&#8221; from our deployment vocabulary and have replaced it with the self&#45;confidence of &#8220;roll&#45;forward&#8221;. We are confident that our engineering practices will continue to improve, thus helping us catch more of those &#8220;gotchas&#8221; up&#45;front in our sprint cycles than when we get to Production.

Congratulations to our teams, thank you so much for your attitude, aptitude, and drive to be the best development team on the planet. You deserve it, our organization deserves it, but most of all, our customers deserve our best. Roll forward!</description>
		<dc:subject>News</dc:subject>
		<dc:date>2011-08-09T19:06:06+00:00</dc:date>
	</item>

	<item>
		<title>The Agile Triangle</title>
		<link>https://developer.fellowshipone.com/index.php/blog/the_agile_triangle/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/the_agile_triangle/#When:16:02:12Z</guid>
		<description>Jim Highsmith presented to DFW Scrum on July 26, 2011. We are grateful for his time and energy to come by and educate us on the true Agile Triangle and how to balance cost, scope, and schedule (which he ascertains are actually constraints, not foundational pieces of the Iron Triangle).

Fellowship Technologies is a proud sponsor of DFW Scrum as they strive to concentrate on various &quot;bands&quot; in Scrum. The process is small and simple, and relatively easy to understand. Doing it... well that is another story altogether. Scrum says &quot;start with a backlog, prioritize it, estimate it, commit to a piece of it in a sprint, deliver potentially shippable product in the end, look back on ways to improve, rinse and repeat&quot;. I also add that our job is to make our organization/customers happy along the way with transparency (which is another post for another time). However, those pieces have logistics all their own and their topics try to focus on each of those pieces to guide us in the actual practice.

Jim Highsmith focused his presentation on value in the backlog. This means trying to ensure the business can actually quantify the user stories in value points against the development teams&#39; story points (cost). He brought a wide array of knowledge focused primarily on managing the projects (either from a PM or Management/Executive stand point). 

One of the great points that stood out for me was the fact that Gantt Charts and traditional project management focused on following the plan with minimal changes while trying to juggle Gantt chart tasks and dependencies against the reality of what is taking place. The Agile leader however focuses on adapting successfully to the inevitable changes and focusing on value to the business over the traditional Iron Triangle notions of Scope, Cost, and Schedule. 

Another highlight of his presentation was The Gap&#39;s business value dials (their metrics for measuring their success). These metrics focus as much on quality and software development indices as they do on market value and quantitive measure of how much the feature is bringing to the bottom line. I think businesses need to hold our Product Managers more accountable to the features they are prioritizing by backing those features with quantitative market value points. Jim highlighted that he had come across very few companies who actually do that.

Here is a PDF copy of Jim&#39;s presentation:

Beyond Scope, Schedule, and Cost (The Agile Triangle)</description>
		<dc:subject>Tips</dc:subject>
		<dc:date>2011-07-27T16:02:12+00:00</dc:date>
	</item>

	<item>
		<title>Conversation Paralysis</title>
		<link>https://developer.fellowshipone.com/index.php/blog/conversation_paralysis/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/conversation_paralysis/#When:20:11:49Z</guid>
		<description>Scrum teaches us that feature requests (user stories) are to be written in the language of the customer (As &amp;lt;some role&amp;gt; I need &amp;lt;some feature&amp;gt; so that I can &amp;lt;get some value&amp;gt;.) These small sentences actually pack a load of information for the technical team reading them and it forces the user to really think about their feature and what they are trying to accomplish. All too often, even the customer doesn&#39;t know exactly what they want, so this format helps them to succinctly describe their problem.

The beauty of the user story however is not necessarily the language or format. The user story is actually the place holder for the conversation that needs to take place. The team can then solve the user&#39;s problem by talking through the solution with the entire team&#39;s knowledge and wisdom at work (all the while conversing with the customer as well).

What is even more beautiful, is that Scrum provides the guide rails that help ensure the team is talking about the problem and not acting as if they are robots on an assembly line. Remember that Scrum is a framework, not a prescriptive methodology. As we go, it places guide rails to help us with our behavior and discipline.

In describing user stories, Scrum helps us to ensure we retain collaboration and teamwork. The more detail that is left out of the story, the more conversation that takes place, and the more conversation that takes place, the better the team and the solution become. Start out with the initial concept, talk about it, make notes, which then brings up other topics and considerations. Various opinions and experiences are injected and the end result should be a well&#45;thought&#45;out solution to a well&#45;thought&#45;out problem.

User stories are usually adorned with acceptance criteria (bullet points that essentially explain to the team how they know they are done). In our organization we use the words &quot;demonstrate&quot; on acceptance criteria to enforce the spirit of Scrum in that the done feature is demonstrable product. The point is to communicate conditions of acceptance for the story, but not eliminate the need for the developers to converse about the final solution. Too often teams can run right down the list of acceptance criteria and start coding the solution as if everything they need to know is in that acceptance criteria.

Ron Jeffries wrote a great post on &quot;The 3 C&#39;s&quot; which details the heart of what we were all taking about in our last DFW Scrum Meeting. Gary McCants stated that acceptance criteria are there to guide you, but don&#39;t let them paralyze your conversation&#45;ability (if that is a word). Ron describes confirmation as the final deliverable to ensure we hit the mark.

Remember that the conversation takes place over time and that the user story is simply the placeholder for those conversations. Don&#39;t write so much detail that you paralyze conversations from happening in your team.</description>
		<dc:subject>Tips</dc:subject>
		<dc:date>2011-07-07T20:11:49+00:00</dc:date>
	</item>

	<item>
		<title>Picture this, image updates &amp;amp; creates through the REST API</title>
		<link>https://developer.fellowshipone.com/index.php/blog/rest_api_picture_this_image_updates_creates/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/rest_api_picture_this_image_updates_creates/#When:19:57:02Z</guid>
		<description>We just released another API update.&amp;nbsp; You can now create and update images from the People realm:


People Images: Show (3rd) | Create (3rd) | Update (3rd)


Any cool ideas on what you can do with this? Let us know what you&#8217;re doing with the API realms via twitter or forum.

Nick Floyd is an Architect for Fellowship Technologies (part of Active Network).&amp;nbsp; Currently he is focused on improving, designing, and building the architecture around the Fellowship One platform.&amp;nbsp; He likes learning about new technologies and languages (the obscure and the vanilla) as well as learning about new trends and practices around getting really good software from development to the users, fast.&amp;nbsp; He is passionate about software development and helping other developers.</description>
		<dc:subject>API, News</dc:subject>
		<dc:date>2011-05-10T19:57:02+00:00</dc:date>
	</item>

	<item>
		<title>A REST API double shot : Groups and Events realms</title>
		<link>https://developer.fellowshipone.com/index.php/blog/a_rest_api_double_shot_groups_and_events_realms/</link>
		<guid>https://developer.fellowshipone.com/index.php/blog/a_rest_api_double_shot_groups_and_events_realms/#When:15:17:23Z</guid>
		<description>We&#8217;re back again to bring you two new realms for accessing your data via FellowshipOne.&amp;nbsp; The Groups Realm and the Events Realm are the two newest members of our API family!&amp;nbsp; The Groups Realm opens up access to Fellowship One&#8217;s Groups 2.0 features and allows churches and vendors to create new Groups 2.0 capabilities or integrate with other solutions.&amp;nbsp; The Events Realm provides access to a primary event that can be associated with a Group within the Groups Realm.

Note:&amp;nbsp; The Events Realm does not at this time provide access to Fellowship One Activities, Check&#45;in, or Event Registration. 

Groups resources
Groups 
 
Groups: List (3rd) | Show (3rd) | Search (3rd) 
Group Types: List (3rd) | Show (3rd) | Search (3rd) 
 
Members 
 
Members: Search (3rd) | List (3rd) | Show (3rd) | New (3rd) | Edit (3rd) | Create (3rd) | Update (3rd) | Delete (3rd) 
Member Types: List (3rd) | Show (3rd) 

Prospects
 
Prospects: New (3rd) | Create (3rd) 

Events 
 
Events: List (3rd) 
 
DateRange Types 
 
DateRange Types: Show (3rd) |&amp;nbsp; List (3rd) 
 
Genders 
 
Genders: Show (3rd) |&amp;nbsp; List (3rd) 
 
Marital Statuses 
 
Marital Statuses: Show (3rd) |&amp;nbsp; List (3rd) 
 
Timezones 
 
Timezones: Show (3rd) |&amp;nbsp; List (3rd) 


Events resources
Events 
 
Events: List (3rd) | Show (3rd) | Edit (3rd) | Update (3rd) 
 
Schedules 
 
Schedules:&amp;nbsp; List (3rd) | Show (3rd) | Edit (3rd) | New (3rd) | Create (3rd) | Update (3rd) | Delete (3rd) 
 
Locations 
 
Locations: List (3rd) | Show (3rd) | Edit (3rd) | New (3rd) | Create (3rd) | Update (3rd) | Delete (3rd) 
 
Recurrence Types 
 
Recurrence Types: List (3rd) | Show (3rd) 
 

Join me in welcoming these new APIs by consuming them!&amp;nbsp; As always let us know what you&#8217;re doing with the API realms via twitter or forum.&amp;nbsp; Please note that if you have existing API keys those keys will need to be activated for the new realms via your request.&amp;nbsp; Simply submit a key request noting in the details field that you are upgrading an existing key and then choose what realms you wan to add to it.

Nick Floyd is an Architect for Fellowship Technologies (part of Active Network).&amp;nbsp; Currently he is focused on improving, designing, and building the architecture around the Fellowship One platform.&amp;nbsp; He likes learning about new technologies and languages (the obscure and the vanilla) as well as learning about new trends and practices around getting really good software from development to the users, fast.&amp;nbsp; He is passionate about software development and helping other developers.</description>
		<dc:subject>API, News</dc:subject>
		<dc:date>2011-05-09T15:17:23+00:00</dc:date>
	</item>


	</channel>
</rss>
