1 # frozen_string_literal: true
2
3 require 'json'
4 require_relative 'auth/version'
5 require_relative 'auth/auth'
6
7 module Auth
8 end
9
10 module SmbCloud
11 module Auth
12 class Error < StandardError
13 attr_reader :error_code, :payload
14
15 def initialize(message = nil, error_code: nil, payload: nil)
16 super(message)
17 @error_code = error_code
18 @payload = payload
19 end
20 end
21
22 module Environment
23 DEV = 'dev'
24 PRODUCTION = 'production'
25 end
26
27 class Client
28 attr_reader :environment, :app_id, :app_secret
29
30 def initialize(environment:, app_id:, app_secret:)
31 @environment = environment
32 @app_id = app_id
33 @app_secret = app_secret
34 end
35
36 def signup(email:, password:)
37 Auth.send(:parse_json, Auth.__signup_with_client(environment, app_id, app_secret, email, password))
38 rescue RuntimeError => e
39 raise Auth.send(:normalize_error, e)
40 end
41
42 def login(email:, password:)
43 Auth.send(:parse_json, Auth.__login_with_client(environment, app_id, app_secret, email, password))
44 rescue RuntimeError => e
45 raise Auth.send(:normalize_error, e)
46 end
47
48 def me(access_token:)
49 Auth.send(:parse_json, Auth.__me_with_client(environment, app_id, app_secret, access_token))
50 rescue RuntimeError => e
51 raise Auth.send(:normalize_error, e)
52 end
53
54 def logout(access_token:)
55 Auth.__logout_with_client(environment, app_id, app_secret, access_token)
56 rescue RuntimeError => e
57 raise Auth.send(:normalize_error, e)
58 end
59
60 def remove(access_token:)
61 Auth.__remove_with_client(environment, app_id, app_secret, access_token)
62 rescue RuntimeError => e
63 raise Auth.send(:normalize_error, e)
64 end
65 end
66
67 class << self
68 def client(environment:, app_id:, app_secret:)
69 Client.new(environment:, app_id:, app_secret:)
70 end
71
72 def signup_with_client(environment:, app_id:, app_secret:, email:, password:)
73 client(environment:, app_id:, app_secret:).signup(email:, password:)
74 end
75
76 def login_with_client(environment:, app_id:, app_secret:, email:, password:)
77 client(environment:, app_id:, app_secret:).login(email:, password:)
78 end
79
80 def me_with_client(environment:, app_id:, app_secret:, access_token:)
81 client(environment:, app_id:, app_secret:).me(access_token:)
82 end
83
84 def logout_with_client(environment:, app_id:, app_secret:, access_token:)
85 client(environment:, app_id:, app_secret:).logout(access_token:)
86 end
87
88 def remove_with_client(environment:, app_id:, app_secret:, access_token:)
89 client(environment:, app_id:, app_secret:).remove(access_token:)
90 end
91
92 private
93
94 def parse_json(payload)
95 return payload unless payload.is_a?(String)
96
97 JSON.parse(payload, symbolize_names: true)
98 end
99
100 def normalize_error(error)
101 payload = parse_json(error.message)
102 error_hash = payload[:error] || payload
103 message = error_hash[:message] || error.message
104 error_code = error_hash[:error_code]
105 Error.new(message, error_code: error_code, payload: payload)
106 rescue JSON::ParserError, NoMethodError, TypeError
107 Error.new(error.message)
108 end
109 end
110 end
111 end