lean-microsoft-graph 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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