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 +7 -0
- data/lib/trymarket/api.rb +53 -0
- data/lib/trymarket/controller.rb +96 -0
- data/lib/trymarket/session.rb +22 -0
- data/lib/trymarket.rb +7 -0
- metadata +74 -0
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
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: []
|