trymarket-rails 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d5917eb9a3782d58a2d8ffc3e39e12b4a3eb07614f3f0c7019f2425c840a67df
4
+ data.tar.gz: ff19f75296d26a691eb696155392d29ea7167ab509ba0cf301a801cf1ce3a559
5
+ SHA512:
6
+ metadata.gz: ef2d4cb1472416d34b29ef31fb09544436ca442a03725346b839c74d77bab1b32b84d3066c0cb64c06bc18af772d324fd80be7823503e4605ce07664bcb46a04
7
+ data.tar.gz: ab66b1fa45831d4da97d32cd9aa0f69c10d4901713f8d9313c6ce0eee86f0bf762905418700fc1dddb3f699b8a04601775736c77556e7528d6400af96567c7ac
@@ -0,0 +1,53 @@
1
+ require "net/http"
2
+ require "json"
3
+ require "uri"
4
+
5
+ module TryMarket
6
+ module API
7
+ class << self
8
+ def validate_token(token)
9
+ data = post("/api/sdk/session/validate", { token: token })
10
+ Session.new(
11
+ user_id: data["userId"],
12
+ email: data["email"],
13
+ handle: data["handle"],
14
+ product: data["product"],
15
+ balance: data["balance"],
16
+ token: token
17
+ )
18
+ end
19
+
20
+ def charge(token, amount, action: nil)
21
+ body = { token: token, amount: amount }
22
+ body[:action] = action if action
23
+ data = post("/api/sdk/session/charge", body)
24
+ data["balance"]
25
+ end
26
+
27
+ private
28
+
29
+ def post(path, body)
30
+ uri = URI("#{BASE_URL}#{path}")
31
+ http = Net::HTTP.new(uri.host, uri.port)
32
+ http.use_ssl = true
33
+
34
+ request = Net::HTTP::Post.new(uri.path)
35
+ request["Content-Type"] = "application/json"
36
+ request.body = JSON.generate(body)
37
+
38
+ response = http.request(request)
39
+
40
+ unless response.is_a?(Net::HTTPSuccess)
41
+ begin
42
+ error_data = JSON.parse(response.body)
43
+ raise Error.new(error_data["error"] || "API request failed", code: response.code.to_i)
44
+ rescue JSON::ParserError
45
+ raise Error.new("API request failed with status #{response.code}", code: response.code.to_i)
46
+ end
47
+ end
48
+
49
+ JSON.parse(response.body)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,96 @@
1
+ module TryMarket
2
+ module Controller
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ helper_method :current_trymarket_session if respond_to?(:helper_method)
7
+ end
8
+
9
+ def tm_gate!
10
+ token = params[:_tm]
11
+
12
+ unless token.present?
13
+ render_gate(401, "Missing try.market session token")
14
+ return
15
+ end
16
+
17
+ begin
18
+ @trymarket_session = TryMarket::API.validate_token(token)
19
+ rescue TryMarket::Error => e
20
+ render_gate(e.code || 401, e.message)
21
+ end
22
+ end
23
+
24
+ def tm_charge!(amount, action: nil)
25
+ session = current_trymarket_session!
26
+ TryMarket::API.charge(session.token, amount, action: action)
27
+ end
28
+
29
+ def current_trymarket_session
30
+ @trymarket_session
31
+ end
32
+
33
+ def current_trymarket_session!
34
+ raise TryMarket::Error.new("No try.market session available") unless @trymarket_session
35
+ @trymarket_session
36
+ end
37
+
38
+ private
39
+
40
+ def render_gate(code, message)
41
+ html = <<~HTML
42
+ <!DOCTYPE html>
43
+ <html>
44
+ <head>
45
+ <meta charset="utf-8">
46
+ <meta name="viewport" content="width=device-width, initial-scale=1">
47
+ <title>Access Denied</title>
48
+ <style>
49
+ body {
50
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ min-height: 100vh;
55
+ margin: 0;
56
+ background: #f9fafb;
57
+ color: #111827;
58
+ }
59
+ .gate {
60
+ text-align: center;
61
+ padding: 2rem;
62
+ max-width: 400px;
63
+ }
64
+ .gate h1 {
65
+ font-size: 1.5rem;
66
+ margin-bottom: 0.5rem;
67
+ }
68
+ .gate p {
69
+ color: #6b7280;
70
+ margin-bottom: 1.5rem;
71
+ }
72
+ .gate a {
73
+ display: inline-block;
74
+ padding: 0.625rem 1.25rem;
75
+ background: #111827;
76
+ color: #fff;
77
+ text-decoration: none;
78
+ border-radius: 0.5rem;
79
+ font-size: 0.875rem;
80
+ }
81
+ </style>
82
+ </head>
83
+ <body>
84
+ <div class="gate">
85
+ <h1>Access Denied</h1>
86
+ <p>#{ERB::Util.html_escape(message)}</p>
87
+ <a href="https://try.market">Go to try.market</a>
88
+ </div>
89
+ </body>
90
+ </html>
91
+ HTML
92
+
93
+ render html: html.html_safe, status: code, layout: false
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,22 @@
1
+ module TryMarket
2
+ class Error < StandardError
3
+ attr_reader :code
4
+
5
+ def initialize(message, code: nil)
6
+ @code = code
7
+ super(message)
8
+ end
9
+ end
10
+
11
+ Session = Struct.new(:user_id, :email, :handle, :product, :balance, :token, keyword_init: true) do
12
+ def to_h
13
+ {
14
+ user_id: user_id,
15
+ email: email,
16
+ handle: handle,
17
+ product: product,
18
+ balance: balance
19
+ }
20
+ end
21
+ end
22
+ end
data/lib/trymarket.rb ADDED
@@ -0,0 +1,7 @@
1
+ require_relative "trymarket/session"
2
+ require_relative "trymarket/api"
3
+ require_relative "trymarket/controller"
4
+
5
+ module TryMarket
6
+ BASE_URL = "https://try.market".freeze
7
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trymarket-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - TryMarket
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-04-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-http
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description:
42
+ email:
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/trymarket.rb
48
+ - lib/trymarket/api.rb
49
+ - lib/trymarket/controller.rb
50
+ - lib/trymarket/session.rb
51
+ homepage:
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubygems_version: 3.0.3.1
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: Rails SDK for try.market embedded apps
74
+ test_files: []