lean-microsoft-graph 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a74cac3f33f72977f108ebd6df574cf7dfb8098dbd351d15dac1db3eafd138f
4
- data.tar.gz: 01437d52cd8b78a5d685d1ed5bd95580633acedb266fd9f42d50a239e84b4409
3
+ metadata.gz: 68d12b40dc1ac7a49f0871b42827af0428474d472e9b06f6e6b18cdfaff67138
4
+ data.tar.gz: f6493c4f976717411ad7b1a0fb08ee97a0faf416dcfa99f05b7375675e89e0f2
5
5
  SHA512:
6
- metadata.gz: 6eeb0692b9e32266cb13b6bfe61fd967f2c3d6a2842f4f373b2e6b071f46537d98bfc32a8a4223ace841f0bb20eb77080221eef5c62ef41d2bb8e2cc25f4010c
7
- data.tar.gz: a7352b5942627897c0f99ead3fd6f165a6a0e65aaf506f003a20eae93e2675399b0edc16165e9a0d3a7bc73fee9ea61b597c866acd2205a1be7dfe22c674b3d2
6
+ metadata.gz: f38076f360a47acc6d05b4b985cf356503316bb90ab8c8e9ff826012005f26fbab25b03e092634987bda14987c2aefd887e7fe0c20d9c9ffce235e93e55e04ef
7
+ data.tar.gz: 25fe8eb56dafb3891d6b6409aa8e4605c4593e0272f9d3f60f131f7889e2da3d0f990ac1815643141baa14acff166ce22a4eb468c94b9e5096e80438f92a92f9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
+
7
+ ## [0.2.0] - 2023-11-04
8
+ ### Added
9
+ - Ability to count users with `client.users.count`.
10
+ - Ability to retrieve users per page with `client.users.get_all(per_page)`.
11
+ - Ability to retrieve users by reference with `client.users.get_all_by_reference('reference')`.
12
+
1
13
  ## [Unreleased]
2
14
 
3
15
  ## [0.1.0] - 2023-08-28
4
16
 
5
17
  - Initial release
18
+
19
+ [0.2.0]: https://github.com/betogrun/lean_microsoft_graph/releases/tag/v0.2.0
data/Gemfile CHANGED
@@ -8,3 +8,5 @@ gemspec
8
8
  gem "rake", "~> 13.0"
9
9
 
10
10
  gem "minitest", "~> 5.0"
11
+
12
+ gem 'mocha', '~> 2.1'
data/Gemfile.lock ADDED
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ lean-microsoft-graph (0.1.0)
5
+ faraday (~> 1.10)
6
+ faraday_middleware (~> 1.0)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ faraday (1.10.3)
12
+ faraday-em_http (~> 1.0)
13
+ faraday-em_synchrony (~> 1.0)
14
+ faraday-excon (~> 1.1)
15
+ faraday-httpclient (~> 1.0)
16
+ faraday-multipart (~> 1.0)
17
+ faraday-net_http (~> 1.0)
18
+ faraday-net_http_persistent (~> 1.0)
19
+ faraday-patron (~> 1.0)
20
+ faraday-rack (~> 1.0)
21
+ faraday-retry (~> 1.0)
22
+ ruby2_keywords (>= 0.0.4)
23
+ faraday-em_http (1.0.0)
24
+ faraday-em_synchrony (1.0.0)
25
+ faraday-excon (1.1.0)
26
+ faraday-httpclient (1.0.1)
27
+ faraday-multipart (1.0.4)
28
+ multipart-post (~> 2)
29
+ faraday-net_http (1.0.1)
30
+ faraday-net_http_persistent (1.2.0)
31
+ faraday-patron (1.0.0)
32
+ faraday-rack (1.0.0)
33
+ faraday-retry (1.0.3)
34
+ faraday_middleware (1.2.0)
35
+ faraday (~> 1.0)
36
+ minitest (5.20.0)
37
+ mocha (2.1.0)
38
+ ruby2_keywords (>= 0.0.5)
39
+ multipart-post (2.3.0)
40
+ rake (13.0.6)
41
+ ruby2_keywords (0.0.5)
42
+
43
+ PLATFORMS
44
+ x86_64-linux
45
+
46
+ DEPENDENCIES
47
+ lean-microsoft-graph!
48
+ minitest (~> 5.0)
49
+ mocha (~> 2.1)
50
+ rake (~> 13.0)
51
+
52
+ BUNDLED WITH
53
+ 2.2.31
data/README.md CHANGED
@@ -22,7 +22,37 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ To start using the LeanMicrosoftGraph gem, you need to create a client instance by providing the tenant_id, client_id, and client_secret.
26
+
27
+ ### Initialize the client
28
+
29
+ ```ruby
30
+ client = LeanMicrosoftGraph::Client.new(
31
+ tenant_id: 'your_tenant_id',
32
+ client_id: 'your_client_id',
33
+ client_secret: 'your_client_secret'
34
+ )
35
+ ```
36
+
37
+ Replace 'your_tenant_id', 'your_client_id', and 'your_client_secret' with your actual Microsoft Azure credentials.
38
+
39
+ ### Count the number of users
40
+
41
+ ```ruby
42
+ count = client.users.count
43
+ puts "Number of users: #{count}"
44
+ ```
45
+
46
+ ### Retrieving all users
47
+
48
+ ```ruby
49
+ per_page = 10 # Set the number of users you want per page
50
+ users = client.users.get_all(per_page)
51
+
52
+ users.each do |user|
53
+ puts "User ID: #{user.id}"
54
+ end
55
+ ```
26
56
 
27
57
  ## Development
28
58
 
data/bin/console CHANGED
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "bundler/setup"
5
- require "lean/microsoft/graph"
5
+ require "lean_microsoft_graph"
6
6
 
7
7
  # You can add fixtures and/or initialization code here to make experimenting
8
8
  # with your gem easier. You can also use a different console, if you like.
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Authentication
5
+ class Credentials
6
+ attr_reader :tenant_id, :client_id, :client_secret
7
+
8
+ def initialize(tenant_id, client_id, client_secret)
9
+ @tenant_id = tenant_id
10
+ @client_id = client_id
11
+ @client_secret = client_secret
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Authentication
5
+ class TokenRetriever
6
+ def initialize(token_resource)
7
+ @token_resource = token_resource
8
+ @token = nil
9
+ end
10
+
11
+ def to_proc
12
+ -> { retrieve }
13
+ end
14
+
15
+ def retrieve
16
+ return @token if @token && !@token.expired?
17
+
18
+ @token = @token_resource.renew
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ class Client
5
+ def initialize(tenant_id:, client_id:, client_secret:, adapter: Faraday.default_adapter, stubs: nil)
6
+ @tenant_id = tenant_id
7
+ @client_id = client_id
8
+ @client_secret = client_secret
9
+ @adapter = adapter
10
+ @stubs = stubs # Stubs for testing purpouses
11
+ end
12
+
13
+ def users
14
+ Resources::UsersResource.new(connection)
15
+ end
16
+
17
+ private
18
+
19
+ def connection
20
+ @connection ||= Faraday.new(url: 'https://graph.microsoft.com/v1.0') do |faraday|
21
+ faraday.request :authorization, 'Bearer', proc(&token_retriever)
22
+ faraday.request :url_encoded
23
+ faraday.request :retry, retry_statuses: [429]
24
+ faraday.adapter @adapter, @stubs
25
+ end
26
+ end
27
+
28
+ def token_retriever
29
+ @token_retriever ||= begin
30
+ token_resource = Resources::TokenResource.new(credentials, @adapter, @stubs)
31
+ Authentication::TokenRetriever.new(token_resource)
32
+ end
33
+ end
34
+
35
+ def credentials
36
+ Authentication::Credentials.new(@tenant_id, @client_id, @client_secret)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ class Error < StandardError; end
5
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ class Resource
5
+ def initialize(connection)
6
+ @connection = connection
7
+ end
8
+
9
+ def get_request(url, params = {}, headers = {}, &block)
10
+ handle_response(@connection.get(url, params, headers, &block))
11
+ end
12
+
13
+ def post_request(url, body = {}, headers = {}, &block)
14
+ handle_response(@connection.post(url, body, headers, &block))
15
+ end
16
+
17
+ private
18
+
19
+ def handle_response(response)
20
+ parsed_response = JSON.parse(response.body, symbolize_names: true)
21
+ return parsed_response if (200..299).include?(response.status)
22
+
23
+ error_message = parsed_response[:error_description]
24
+ error_code = parsed_response[:error_codes]
25
+
26
+ puts parsed_response
27
+
28
+ case { status: response.status, code: error_code, message: error_message }
29
+ in { status: 400, code: code, message: message }
30
+ raise Error, "Bad request. Code: #{code}. Message: #{message}"
31
+ in { status: 401, code: code, message: message }
32
+ raise Error, "Unauthorized. Check permissions or authentication token. Code: #{code}. Message: #{message}"
33
+ in { status: 403, code: code, message: message }
34
+ raise Error, "Forbidden. Insufficient permissions. Code: #{code}. Message: #{message}"
35
+ in { status: 404, code: code, message: message }
36
+ raise Error, "Resource not found. Code: #{code}. Message: #{message}"
37
+ in { status: 429, code: code, message: message }
38
+ raise Error, "Too many requests. Rate limit exceeded. Code: #{code}. Message: #{message}"
39
+ in { status: 500, code: code, message: message }
40
+ raise Error, "Internal server error. Code: #{code}. Message: #{message}"
41
+ in { status: 503, code: code, message: message }
42
+ raise Error, "Service unavailable. Try again later. Code: #{code}. Message: #{message}"
43
+ else
44
+ raise Error, "An unknown error occurred with status: #{response.status}."
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Resources
5
+ class TokenResource
6
+ class Token
7
+ attr_reader :value, :expires_in
8
+
9
+ def initialize(value, expires_in)
10
+ @value = value
11
+ @expires_in = expires_in
12
+ @created_at = Time.now
13
+ end
14
+
15
+ def expires_at
16
+ @created_at + @expires_in
17
+ end
18
+
19
+ def expired?
20
+ Time.now > expires_at
21
+ end
22
+
23
+ def to_s
24
+ @value
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Resources
5
+ class TokenResource < ::LeanMicrosoftGraph::Resource
6
+ def initialize(credentials, adapter = Faraday.default_adapter, stubs = nil)
7
+ super(Faraday.new { |faraday| faraday.adapter(adapter, stubs)})
8
+ @credentials = credentials
9
+ end
10
+
11
+ def renew
12
+ url = "https://login.microsoftonline.com/#{@credentials.tenant_id}/oauth2/v2.0/token"
13
+ headers = { 'Content-Type' => 'application/x-www-form-urlencoded' }
14
+ body = {
15
+ 'client_id' => @credentials.client_id,
16
+ 'scope' => 'https://graph.microsoft.com/.default',
17
+ 'client_secret' => @credentials.client_secret,
18
+ 'grant_type' => 'client_credentials'
19
+ }
20
+ response = post_request(url, URI.encode_www_form(body), headers)
21
+
22
+ Token.new(response[:access_token], response[:expires_in].to_i)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Resources
5
+ class UsersResource
6
+ class User
7
+ def initialize(response)
8
+ @response = response
9
+ end
10
+
11
+ def id = @response[:id]
12
+
13
+ def display_name = @response[:displayName]
14
+
15
+ def mail = @response[:mail]
16
+
17
+ def user_principal_name = @response[:userPrincipalName]
18
+
19
+ def job_title = @response[:jobTitle]
20
+
21
+ def mobile_phone = @response[:mobilePhone]
22
+
23
+ def business_phones = @response[:businessPhones]
24
+
25
+ def given_name = @response[:givenName]
26
+
27
+ def surname = @response[:surname]
28
+
29
+ def preferred_language = @response[:preferredLanguage]
30
+
31
+ def office_location = @response[:officeLocation]
32
+
33
+ def to_h
34
+ {
35
+ id: id,
36
+ display_name: display_name,
37
+ mail: mail,
38
+ user_principal_name: user_principal_name,
39
+ job_title: job_title,
40
+ mobile_phone: mobile_phone,
41
+ business_phones: business_phones,
42
+ given_name: given_name,
43
+ surname: surname,
44
+ preferred_language: preferred_language,
45
+ office_location: office_location
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Resources
5
+ class UsersResource
6
+ class Users
7
+ include Enumerable
8
+
9
+ def initialize(response)
10
+ @response = response
11
+ end
12
+
13
+ def each(&block)
14
+ collection.each(&block)
15
+ end
16
+
17
+ def next_batch_reference = @response[:'@odata.nextLink']
18
+
19
+ private
20
+
21
+ def collection
22
+ @collection ||= @response[:value].map { |user| User.new(user) }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ module Resources
5
+ class UsersResource < ::LeanMicrosoftGraph::Resource
6
+ def count
7
+ get_request('users/$count') do |req|
8
+ req.headers['ConsistencyLevel'] = 'eventual'
9
+ end
10
+ end
11
+
12
+ def get_all(per_page)
13
+ response = get_request('users') do |req|
14
+ req.params['$top'] = per_page
15
+ end
16
+
17
+ Users.new(response)
18
+ end
19
+
20
+ def get_all_by_reference(url)
21
+ response = get_request(url)
22
+
23
+ Users.new(response)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LeanMicrosoftGraph
4
+ VERSION = "0.2.0"
5
+ end
@@ -0,0 +1,17 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'json'
4
+
5
+ module LeanMicrosoftGraph
6
+ require 'lean_microsoft_graph/version'
7
+ require 'lean_microsoft_graph/error'
8
+ require 'lean_microsoft_graph/resource'
9
+ require 'lean_microsoft_graph/client'
10
+ require 'lean_microsoft_graph/authentication/credentials'
11
+ require 'lean_microsoft_graph/authentication/token_retriever'
12
+ require 'lean_microsoft_graph/resources/token_resource'
13
+ require 'lean_microsoft_graph/resources/token_resource/token'
14
+ require 'lean_microsoft_graph/resources/users_resource'
15
+ require 'lean_microsoft_graph/resources/users_resource/user'
16
+ require 'lean_microsoft_graph/resources/users_resource/users'
17
+ end
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lean-microsoft-graph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alberto Rocha
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-08-28 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2023-11-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
13
41
  description: This gem provides a set of methods to interact with Microsoft Graph API.
14
42
  email:
15
43
  - betogrun@gmail.com
@@ -19,13 +47,24 @@ extra_rdoc_files: []
19
47
  files:
20
48
  - CHANGELOG.md
21
49
  - Gemfile
50
+ - Gemfile.lock
22
51
  - LICENSE.txt
23
52
  - README.md
24
53
  - Rakefile
25
54
  - bin/console
26
55
  - bin/setup
27
- - lib/lean/microsoft/graph.rb
28
- - lib/lean/microsoft/graph/version.rb
56
+ - lib/lean_microsoft_graph.rb
57
+ - lib/lean_microsoft_graph/authentication/credentials.rb
58
+ - lib/lean_microsoft_graph/authentication/token_retriever.rb
59
+ - lib/lean_microsoft_graph/client.rb
60
+ - lib/lean_microsoft_graph/error.rb
61
+ - lib/lean_microsoft_graph/resource.rb
62
+ - lib/lean_microsoft_graph/resources/token_resource.rb
63
+ - lib/lean_microsoft_graph/resources/token_resource/token.rb
64
+ - lib/lean_microsoft_graph/resources/users_resource.rb
65
+ - lib/lean_microsoft_graph/resources/users_resource/user.rb
66
+ - lib/lean_microsoft_graph/resources/users_resource/users.rb
67
+ - lib/lean_microsoft_graph/version.rb
29
68
  homepage: https://github.com/betogrun/lean-microsoft-graph
30
69
  licenses:
31
70
  - MIT
@@ -47,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
86
  - !ruby/object:Gem::Version
48
87
  version: '0'
49
88
  requirements: []
50
- rubygems_version: 3.1.4
89
+ rubygems_version: 3.4.1
51
90
  signing_key:
52
91
  specification_version: 4
53
92
  summary: "'lean-microsoft-graph' is a gem is a simple interface to Microsoft Graph
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Lean
4
- module Microsoft
5
- module Graph
6
- VERSION = "0.1.0"
7
- end
8
- end
9
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "graph/version"
4
-
5
- module Lean
6
- module Microsoft
7
- module Graph
8
- class Error < StandardError; end
9
- # Your code goes here...
10
- end
11
- end
12
- end