trogdir_api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1c0461f30e10661b43c4d43250326dcc5c135eff
4
+ data.tar.gz: 9edfd9a1b18c4ed633841d2821c595ec89d75df4
5
+ SHA512:
6
+ metadata.gz: ee5b4c1468f78d401e0c55afe48a0359e5b111d3e8b17c6f9b497f37809d50e285bd2eb5a7570f3920e14fde7a141659880847e0f59563fe8d50590c604e50e9
7
+ data.tar.gz: a5c94365037a666d4ebc73f4836874416e96f6ea02fe98073aa09dd1359c686dbc09cb23ece5408df2d82e00dbf5572f28e9a151126a18c0acba71541009d798
data/MIT-LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2014 by Biola University
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ Trogdir API [![Build Status](https://travis-ci.org/biola/trogdir-api.png)](https://travis-ci.org/biola/trogdir-api)
2
+ ===========
3
+ RESTful APIs for the Trogdir directory project.
@@ -0,0 +1,5 @@
1
+ require 'bundler'
2
+ Bundler.setup :default, ENV['RACK_ENV'] || ENV['RAILS_ENV'] || :developement
3
+
4
+ require_relative '../lib/trogdir_api'
5
+ TrogdirAPI.initialize!
@@ -0,0 +1,13 @@
1
+ development:
2
+ sessions:
3
+ default:
4
+ database: trogdir_development
5
+ hosts:
6
+ - localhost:27017
7
+
8
+ test:
9
+ sessions:
10
+ default:
11
+ database: trogdir_test
12
+ hosts:
13
+ - localhost:27017
@@ -0,0 +1,35 @@
1
+ development:
2
+ sessions:
3
+ default:
4
+ database: trogdir_development
5
+ hosts:
6
+ - localhost:27017
7
+
8
+ test:
9
+ sessions:
10
+ default:
11
+ database: trogdir_test
12
+ hosts:
13
+ - localhost:27017
14
+
15
+ staging:
16
+ sessions:
17
+ default:
18
+ database: trogdir
19
+ hosts:
20
+ - mongo1.staging.biola.edu:27017
21
+ - mongo2.staging.biola.edu:27017
22
+ - mongo3.staging.biola.edu:27017
23
+ username: trogdir
24
+ password: "*************"
25
+
26
+ production:
27
+ sessions:
28
+ default:
29
+ database: trogdir
30
+ hosts:
31
+ - mongo1.prod.biola.edu:27017
32
+ - mongo2.prod.biola.edu:27017
33
+ - mongo3.prod.biola.edu:27017
34
+ username: trogdir
35
+ password: "*************"
data/config.ru ADDED
@@ -0,0 +1,8 @@
1
+ require ::File.expand_path('../config/environment', __FILE__)
2
+
3
+ if ENV['RACK_ENV'] == 'development'
4
+ require 'better_errors'
5
+ use BetterErrors::Middleware
6
+ end
7
+
8
+ run Trogdir::API
@@ -0,0 +1,5 @@
1
+ module Trogdir
2
+ class API < Grape::API
3
+ mount Trogdir::V1::API
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ module AuthenticationHelpers
2
+ def rack_request
3
+ Rack::Request.new(@env)
4
+ end
5
+
6
+ def current_syncinator
7
+ access_id = ApiAuth.access_id(rack_request)
8
+ Syncinator.where(access_id: access_id).first
9
+ end
10
+
11
+ def authentic?
12
+ secret_key = current_syncinator.try(:secret_key)
13
+
14
+ ApiAuth.authentic? rack_request, secret_key
15
+ end
16
+
17
+ def authenticate!
18
+ unauthorized! unless authentic?
19
+ end
20
+
21
+ def unauthorized!
22
+ error!('401 Unauthorized', 401)
23
+ end
24
+ end
@@ -0,0 +1,8 @@
1
+ module Trogdir
2
+ module RequestHelpers
3
+ def clean_params(options = {})
4
+ exceptions = Array(options[:except])
5
+ params.except(*(['route_info'] + exceptions))
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module Trogdir
2
+ module ResponseHelpers
3
+ def raise_404
4
+ error!('404 Not Found', 404)
5
+ end
6
+
7
+ def elem_match_or_404(klass, conditions)
8
+ klass.elem_match(conditions).first or raise_404
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,52 @@
1
+ module Trogdir
2
+ module V1
3
+ class AddressesAPI < Grape::API
4
+ resource :addresses do
5
+ get do
6
+ present Person.find_by(uuid: params[:person_id]).addresses, with: AddressEntity
7
+ end
8
+
9
+ params do
10
+ requires :address_id, type: String
11
+ end
12
+ get ':address_id' do
13
+ present Person.find_by(uuid: params[:person_id]).addresses.find(params[:address_id]), with: AddressEntity
14
+ end
15
+
16
+ params do
17
+ requires :type, type: Symbol, values: Address::TYPES
18
+ requires :street_1, type: String
19
+ optional :street_1, type: String
20
+ optional :city, type: String
21
+ optional :state, type: String
22
+ optional :zip, type: String
23
+ optional :contry, type: String
24
+ end
25
+ post do
26
+ Person.find_by(uuid: params[:person_id]).addresses.create! clean_params(except: :person_id)
27
+ end
28
+
29
+ params do
30
+ requires :address_id, type: String
31
+ optional :type, type: Symbol, values: Address::TYPES
32
+ optional :street_1, type: String
33
+ optional :street_1, type: String
34
+ optional :city, type: String
35
+ optional :state, type: String
36
+ optional :zip, type: String
37
+ optional :contry, type: String
38
+ end
39
+ put ':address_id' do
40
+ Person.find_by(uuid: params[:person_id]).addresses.find(params[:address_id]).update_attributes! clean_params(except: [:person_id, :address_id])
41
+ end
42
+
43
+ params do
44
+ requires :address_id, type: String
45
+ end
46
+ delete ':address_id' do
47
+ Person.find_by(uuid: params[:person_id]).addresses.find(params[:address_id]).destroy
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,29 @@
1
+ module Trogdir
2
+ module V1
3
+ class API < Grape::API
4
+ version 'v1', using: :path
5
+
6
+ format :json
7
+ helpers RequestHelpers
8
+ helpers ResponseHelpers
9
+ helpers AuthenticationHelpers
10
+
11
+ before { authenticate! }
12
+
13
+ rescue_from Mongoid::Errors::DocumentNotFound do |e|
14
+ error! "404 Not Found", 404
15
+ end
16
+
17
+ mount PeopleAPI
18
+ mount ChangeSyncsAPI
19
+
20
+ resource 'people/:person_id' do
21
+ mount IDsAPI
22
+ mount EmailsAPI
23
+ mount PhotosAPI
24
+ mount PhonesAPI
25
+ mount AddressesAPI
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,46 @@
1
+ module Trogdir
2
+ module V1
3
+ class ChangeSyncsAPI < Grape::API
4
+ resource :change_syncs do
5
+ desc "Return and starts change_syncs that haven't been started"
6
+ put :start do
7
+ syncinator = current_syncinator
8
+ changesets = syncinator.startable_changesets
9
+
10
+ sync_logs = changesets.map do |changeset|
11
+ syncinator.start! changeset
12
+ end
13
+
14
+ present sync_logs, with: SyncLogWithChangesetEntity
15
+ end
16
+
17
+ desc "Return a sync_log and mark it as errored"
18
+ params do
19
+ requires :sync_log_id, type: String
20
+ requires :message, type: String
21
+ end
22
+ put 'error/:sync_log_id' do
23
+ sync_log = SyncLog.find_through_parents(params[:sync_log_id])
24
+
25
+ unauthorized! unless sync_log.syncinator == current_syncinator
26
+
27
+ current_syncinator.error! sync_log, params[:message]
28
+ end
29
+
30
+ desc "Return a sync_log and mark it as succeeded"
31
+ params do
32
+ requires :sync_log_id, type: String
33
+ requires :action, type: String
34
+ optional :message, type: String
35
+ end
36
+ put 'finish/:sync_log_id' do
37
+ sync_log = SyncLog.find_through_parents(params[:sync_log_id])
38
+
39
+ unauthorized! unless sync_log.syncinator == current_syncinator
40
+
41
+ current_syncinator.finish! sync_log, params[:action], params[:message]
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,44 @@
1
+ module Trogdir
2
+ module V1
3
+ class EmailsAPI < Grape::API
4
+ resource :emails do
5
+ get do
6
+ present Person.find_by(uuid: params[:person_id]).emails, with: EmailEntity
7
+ end
8
+
9
+ params do
10
+ requires :email_id, type: String
11
+ end
12
+ get ':email_id' do
13
+ present Person.find_by(uuid: params[:person_id]).emails.find(params[:email_id]), with: EmailEntity
14
+ end
15
+
16
+ params do
17
+ requires :type, type: Symbol, values: Email::TYPES
18
+ requires :address, type: String
19
+ optional :primary, type: Boolean
20
+ end
21
+ post do
22
+ Person.find_by(uuid: params[:person_id]).emails.create! clean_params(except: :person_id)
23
+ end
24
+
25
+ params do
26
+ requires :email_id, type: String
27
+ optional :type, type: Symbol, values: Email::TYPES
28
+ optional :address, type: String
29
+ optional :primary, type: Boolean
30
+ end
31
+ put ':email_id' do
32
+ Person.find_by(uuid: params[:person_id]).emails.find(params[:email_id]).update_attributes! clean_params(except: [:person_id, :email_id])
33
+ end
34
+
35
+ params do
36
+ requires :email_id, type: String
37
+ end
38
+ delete ':email_id' do
39
+ Person.find_by(uuid: params[:person_id]).emails.find(params[:email_id]).destroy
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,13 @@
1
+ module Trogdir
2
+ module V1
3
+ class AddressEntity < Grape::Entity
4
+ expose :type
5
+ expose :street_1
6
+ expose :street_2
7
+ expose :city
8
+ expose :state
9
+ expose :zip
10
+ expose :country
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ module Trogdir
2
+ module V1
3
+ class EmailEntity < Grape::Entity
4
+ expose :type
5
+ expose :address
6
+ expose :primary
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ module Trogdir
2
+ module V1
3
+ class IDEntity < Grape::Entity
4
+ expose :type
5
+ expose :identifier
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,52 @@
1
+ module Trogdir
2
+ module V1
3
+ class PersonEntity < Grape::Entity
4
+ expose :ids, using: IDEntity, as: :ids
5
+ expose :emails, using: EmailEntity, as: :emails
6
+ expose :photos, using: PhotoEntity, as: :photos
7
+ expose :phones, using: PhoneEntity, as: :phones
8
+ expose :addresses, using: AddressEntity, as: :addresses
9
+
10
+ expose :uuid
11
+
12
+ # Names
13
+ expose :first_name
14
+ expose :preferred_name
15
+ expose :middle_name
16
+ expose :last_name
17
+ expose :display_name
18
+
19
+ # Demographic
20
+ expose :gender
21
+ expose :partial_ssn
22
+ expose :birth_date
23
+
24
+ # Groups and permissions
25
+ expose :entitlements
26
+ expose :affiliations
27
+
28
+ # Options
29
+ expose :enabled
30
+
31
+ # STUDENT INFO #
32
+
33
+ # On-Campus Residence
34
+ expose :residence
35
+ expose :floor
36
+ expose :wing
37
+
38
+ # Academic
39
+ expose :majors
40
+
41
+ # FERPA
42
+ expose :privacy
43
+
44
+ # EMPLOYEE INFO #
45
+ expose :department
46
+ expose :title
47
+ expose :employee_type
48
+ expose :full_time
49
+ expose :pay_type
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,9 @@
1
+ module Trogdir
2
+ module V1
3
+ class PhoneEntity < Grape::Entity
4
+ expose :type
5
+ expose :number
6
+ expose :primary
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Trogdir
2
+ module V1
3
+ class PhotoEntity < Grape::Entity
4
+ expose :type
5
+ expose :url
6
+ expose :height
7
+ expose :width
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module Trogdir
2
+ module V1
3
+ class SyncLogEntity < Grape::Entity
4
+ expose(:sync_log_id) { |sync_log| sync_log.id }
5
+ expose :started_at
6
+ expose :errored_at
7
+ expose :succeeded_at
8
+ expose :action
9
+ expose :message
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module Trogdir
2
+ module V1
3
+ class SyncLogWithChangesetEntity < Grape::Entity
4
+ expose(:sync_log_id) { |sync_log| sync_log.id }
5
+ expose(:action) { |sync_log| sync_log.changeset.action }
6
+ expose(:person_id) { |sync_log| sync_log.changeset.person.uuid }
7
+ expose(:scope) { |sync_log| sync_log.changeset.scope }
8
+ expose(:original) { |sync_log| sync_log.changeset.original }
9
+ expose(:modified) { |sync_log| sync_log.changeset.modified }
10
+ expose(:created_at) { |sync_log| sync_log.changeset.created_at }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,43 @@
1
+ module Trogdir
2
+ module V1
3
+ class IDsAPI < Grape::API
4
+ resource :ids do
5
+ get do
6
+ present Person.find_by(uuid: params[:person_id]).ids, with: IDEntity
7
+ end
8
+
9
+ params do
10
+ # Stupid name. I know. But you get the idea.
11
+ requires :id_id, type: String
12
+ end
13
+ get ':id_id' do
14
+ present Person.find_by(uuid: params[:person_id]).ids.find(params[:id_id]), with: IDEntity
15
+ end
16
+
17
+ params do
18
+ requires :type, type: Symbol, values: ID::TYPES
19
+ requires :identifier
20
+ end
21
+ post do
22
+ Person.find_by(uuid: params[:person_id]).ids.create! clean_params(except: :person_id)
23
+ end
24
+
25
+ params do
26
+ requires :id_id, type: String
27
+ optional :type, type: Symbol, values: ID::TYPES
28
+ optional :identifier
29
+ end
30
+ put ':id_id' do
31
+ Person.find_by(uuid: params[:person_id]).ids.find(params[:id_id]).update_attributes! clean_params(except: [:person_id, :id_id])
32
+ end
33
+
34
+ params do
35
+ requires :id_id, type: String
36
+ end
37
+ delete ':id_id' do
38
+ Person.find_by(uuid: params[:person_id]).ids.find(params[:id_id]).destroy
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,127 @@
1
+ module Trogdir
2
+ module V1
3
+ class PeopleAPI < Grape::API
4
+ UUID_REGEXP = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
5
+
6
+ resource :people do
7
+ desc 'Get a list of people'
8
+ params do
9
+ optional :affiliation, type: String
10
+ end
11
+ get do
12
+ conditions = {}
13
+
14
+ conditions[:affiliations] = params[:affiliation].to_s if params[:affiliation]
15
+
16
+ present Person.where(conditions), with: PersonEntity
17
+ end
18
+
19
+ desc 'Return a person by associated id', {params: PersonEntity.documentation.except(:enabled)}
20
+ params do
21
+ requires :identifier, type: String, desc: 'Associated identifier'
22
+ optional :type, type: Symbol, values: ID::TYPES, default: ID::DEFAULT_TYPE
23
+ end
24
+ get 'by_id/:identifier', requirements: {identifier: /[0-9a-zA-Z\._-]+/} do
25
+ conditions = {ids: {type: params[:type], identifier: params[:identifier]}}
26
+
27
+ present elem_match_or_404(Person, conditions), with: PersonEntity
28
+ end
29
+
30
+ desc 'Return a person', {params: PersonEntity.documentation.except(:enabled)}
31
+ params do
32
+ requires :person_id, desc: 'Person ID'
33
+ end
34
+ get ':person_id', requirements: {person_id: UUID_REGEXP} do
35
+ present Person.find_by(uuid: params[:person_id]), with: PersonEntity
36
+ end
37
+
38
+ desc 'Create a person'
39
+ params do
40
+ # Names
41
+ requires :first_name, type: String
42
+ optional :preferred_name, type: String
43
+ optional :middle_name, type: String
44
+ requires :last_name, type: String
45
+ optional :display_name, type: String
46
+
47
+ # Demographic
48
+ optional :gender, type: Symbol, values: Person::GENDERS
49
+ optional :partial_ssn, type: String
50
+ optional :birth_date, type: Date
51
+
52
+ # Groups and permissions
53
+ optional :entitlements, type: Array
54
+ optional :affiliations, type: Array
55
+
56
+ # STUDENT INFO #
57
+
58
+ # On-Campus Residence
59
+ optional :residence, type: String
60
+ optional :floor, type: Integer
61
+ optional :wing, type: String
62
+
63
+ # Academic
64
+ optional :majors, type: Array
65
+
66
+ # FERPA
67
+ optional :privacy, type: Boolean
68
+
69
+ # EMPLOYEE INFO #
70
+ optional :department, type: String
71
+ optional :title, type: String
72
+ optional :employee_type, type: Symbol
73
+ optional :full_time, type: Boolean
74
+ optional :pay_type, type: Symbol
75
+ end
76
+ post do
77
+ present Person.create!(clean_params), with: PersonEntity
78
+ end
79
+
80
+ desc 'Update a person'
81
+ params do
82
+ # Names
83
+ optional :first_name, type: String
84
+ optional :preferred_name, type: String
85
+ optional :middle_name, type: String
86
+ optional :last_name, type: String
87
+ optional :display_name, type: String
88
+
89
+ # Demographic
90
+ optional :gender, type: Symbol, values: Person::GENDERS
91
+ optional :partial_ssn, type: String
92
+ optional :birth_date, type: Date
93
+
94
+ # Groups and permissions
95
+ optional :entitlements, type: Array
96
+ optional :affiliations, type: Array
97
+
98
+ # STUDENT INFO #
99
+
100
+ # On-Campus Residence
101
+ optional :residence, type: String
102
+ optional :floor, type: Integer
103
+ optional :wing, type: String
104
+
105
+ # Academic
106
+ optional :majors, type: Array
107
+
108
+ # FERPA
109
+ optional :privacy, type: Boolean
110
+
111
+ # EMPLOYEE INFO #
112
+ optional :department, type: String
113
+ optional :title, type: String
114
+ optional :employee_type, type: Symbol
115
+ optional :full_time, type: Boolean
116
+ optional :pay_type, type: Symbol
117
+ end
118
+ put ':person_id', requirements: {person_id: UUID_REGEXP} do
119
+ person = Person.find_by(uuid: params[:person_id])
120
+ person.update_attributes! clean_params(except: :person_id)
121
+
122
+ present person, with: PersonEntity
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,44 @@
1
+ module Trogdir
2
+ module V1
3
+ class PhonesAPI < Grape::API
4
+ resource :phones do
5
+ get do
6
+ present Person.find_by(uuid: params[:person_id]).phones, with: PhoneEntity
7
+ end
8
+
9
+ params do
10
+ requires :phone_id, type: String
11
+ end
12
+ get ':phone_id' do
13
+ present Person.find_by(uuid: params[:person_id]).phones.find(params[:phone_id]), with: PhoneEntity
14
+ end
15
+
16
+ params do
17
+ requires :type, type: Symbol, values: Phone::TYPES
18
+ requires :number, type: String
19
+ optional :primary, type: Boolean
20
+ end
21
+ post do
22
+ Person.find_by(uuid: params[:person_id]).phones.create! clean_params(except: :person_id)
23
+ end
24
+
25
+ params do
26
+ requires :phone_id, type: String
27
+ optional :type, type: Symbol, values: Phone::TYPES
28
+ optional :number, type: String
29
+ optional :primary, type: Boolean
30
+ end
31
+ put ':phone_id' do
32
+ Person.find_by(uuid: params[:person_id]).phones.find(params[:phone_id]).update_attributes! clean_params(except: [:person_id, :phone_id])
33
+ end
34
+
35
+ params do
36
+ requires :phone_id, type: String
37
+ end
38
+ delete ':phone_id' do
39
+ Person.find_by(uuid: params[:person_id]).phones.find(params[:phone_id]).destroy
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ module Trogdir
2
+ module V1
3
+ class PhotosAPI < Grape::API
4
+ resource :photos do
5
+ get do
6
+ present Person.find_by(uuid: params[:person_id]).photos, with: PhotoEntity
7
+ end
8
+
9
+ params do
10
+ requires :photo_id, type: String
11
+ end
12
+ get ':photo_id' do
13
+ present Person.find_by(uuid: params[:person_id]).photos.find(params[:photo_id]), with: PhotoEntity
14
+ end
15
+
16
+ params do
17
+ requires :type, type: Symbol, values: Photo::TYPES
18
+ requires :url, type: String
19
+ optional :height, type: Integer
20
+ optional :width, type: Integer
21
+ end
22
+ post do
23
+ Person.find_by(uuid: params[:person_id]).photos.create! clean_params(except: :person_id)
24
+ end
25
+
26
+ params do
27
+ requires :photo_id, type: String
28
+ optional :type, type: Symbol, values: Photo::TYPES
29
+ optional :url, type: String
30
+ optional :height, type: Integer
31
+ optional :width, type: Integer
32
+ end
33
+ put ':photo_id' do
34
+ Person.find_by(uuid: params[:person_id]).photos.find(params[:photo_id]).update_attributes! clean_params(except: [:person_id, :photo_id])
35
+ end
36
+
37
+ params do
38
+ requires :photo_id, type: String
39
+ end
40
+ delete ':photo_id' do
41
+ Person.find_by(uuid: params[:person_id]).photos.find(params[:photo_id]).destroy
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,20 @@
1
+ module Trogdir
2
+ module V1
3
+ autoload :API, File.expand_path('../v1/api', __FILE__)
4
+ autoload :ChangeSyncsAPI, File.expand_path('../v1/change_syncs_api', __FILE__)
5
+ autoload :PeopleAPI, File.expand_path('../v1/people_api', __FILE__)
6
+ autoload :IDsAPI, File.expand_path('../v1/ids_api', __FILE__)
7
+ autoload :EmailsAPI, File.expand_path('../v1/emails_api', __FILE__)
8
+ autoload :PhotosAPI, File.expand_path('../v1/photos_api', __FILE__)
9
+ autoload :PhonesAPI, File.expand_path('../v1/phones_api', __FILE__)
10
+ autoload :AddressesAPI, File.expand_path('../v1/addresses_api', __FILE__)
11
+ autoload :SyncLogEntity, File.expand_path('../v1/entities/sync_log', __FILE__)
12
+ autoload :SyncLogWithChangesetEntity, File.expand_path('../v1/entities/sync_log_with_changeset', __FILE__)
13
+ autoload :PersonEntity, File.expand_path('../v1/entities/person', __FILE__)
14
+ autoload :IDEntity, File.expand_path('../v1/entities/id', __FILE__)
15
+ autoload :EmailEntity, File.expand_path('../v1/entities/email', __FILE__)
16
+ autoload :PhotoEntity, File.expand_path('../v1/entities/photo', __FILE__)
17
+ autoload :PhoneEntity, File.expand_path('../v1/entities/phone', __FILE__)
18
+ autoload :AddressEntity, File.expand_path('../v1/entities/address', __FILE__)
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module TrogdirAPI
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,22 @@
1
+ require 'grape'
2
+ require 'grape-entity'
3
+ require 'api_auth'
4
+ require 'trogdir_models'
5
+
6
+ module TrogdirAPI
7
+ def self.initialize!
8
+ ENV['RACK_ENV'] ||= 'development'
9
+
10
+ mongoid_yml_path = File.expand_path('../../config/mongoid.yml', __FILE__)
11
+ mongoid_yml_path = "#{mongoid_yml_path}.example" if !File.exists? mongoid_yml_path
12
+ Mongoid.load! mongoid_yml_path
13
+ end
14
+ end
15
+
16
+ module Trogdir
17
+ autoload :AuthenticationHelpers, File.expand_path('../trogdir/helpers/authentication_helpers', __FILE__)
18
+ autoload :ResponseHelpers, File.expand_path('../trogdir/helpers/response_helpers', __FILE__)
19
+ autoload :RequestHelpers, File.expand_path('../trogdir/helpers/request_helpers', __FILE__)
20
+ autoload :API, File.expand_path('../trogdir/api', __FILE__)
21
+ autoload :V1, File.expand_path('../trogdir/versions/v1', __FILE__)
22
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trogdir_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Adam Crownoble
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: api-auth
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: grape
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: grape-entity
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.4'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.4'
55
+ - !ruby/object:Gem::Dependency
56
+ name: trogdir_models
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: API for the Trogdir directory project
70
+ email: adam.crownoble@biola.edu
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - MIT-LICENSE
76
+ - README.md
77
+ - config.ru
78
+ - config/environment.rb
79
+ - config/mongoid.yml
80
+ - config/mongoid.yml.example
81
+ - lib/trogdir/api.rb
82
+ - lib/trogdir/helpers/authentication_helpers.rb
83
+ - lib/trogdir/helpers/request_helpers.rb
84
+ - lib/trogdir/helpers/response_helpers.rb
85
+ - lib/trogdir/versions/v1.rb
86
+ - lib/trogdir/versions/v1/addresses_api.rb
87
+ - lib/trogdir/versions/v1/api.rb
88
+ - lib/trogdir/versions/v1/change_syncs_api.rb
89
+ - lib/trogdir/versions/v1/emails_api.rb
90
+ - lib/trogdir/versions/v1/entities/address.rb
91
+ - lib/trogdir/versions/v1/entities/email.rb
92
+ - lib/trogdir/versions/v1/entities/id.rb
93
+ - lib/trogdir/versions/v1/entities/person.rb
94
+ - lib/trogdir/versions/v1/entities/phone.rb
95
+ - lib/trogdir/versions/v1/entities/photo.rb
96
+ - lib/trogdir/versions/v1/entities/sync_log.rb
97
+ - lib/trogdir/versions/v1/entities/sync_log_with_changeset.rb
98
+ - lib/trogdir/versions/v1/ids_api.rb
99
+ - lib/trogdir/versions/v1/people_api.rb
100
+ - lib/trogdir/versions/v1/phones_api.rb
101
+ - lib/trogdir/versions/v1/photos_api.rb
102
+ - lib/trogdir_api.rb
103
+ - lib/trogdir_api/version.rb
104
+ homepage: https://github.com/biola/trogdir-api
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.2.2
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Trogdir directory API
128
+ test_files: []