This repository has been archived by the owner on Jul 21, 2020. It is now read-only.
/
model.rb
141 lines (124 loc) · 3.55 KB
/
model.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
module ChatGram
# Defines the interface for the data model.
class Model
def initialize(options = {})
raise NotImplementedError
end
# Public: Checks to see if the user is registered.
#
# username - The String Instagram username.
#
# Returns true if the user exists, or false.
def exists?(username)
find(username) ? true : false
end
# Public: Checks to see if the user is approved to have their photos
# posted.
#
# username - The String Instagram username.
#
# Returns true if the user is approved, or false.
def approved?(username)
if user = find(username)
!user[:token].to_s.empty?
else
false
end
end
def find(username)
raise NotImplementedError
end
def approve(username, token)
raise NotImplementedError
end
def insert(username, token = nil)
raise NotImplementedError
end
def setup
end
require 'sequel'
# Defines a class that stores users in a DB using the Sequel gem. This
# tracks the OAuth token for users, and makes sure only approved users
# have their photos posted to the chat service.
class Database < Model
attr_reader :db
# Initializes a new Sequel connection.
#
# options - Options Hash:
# url - The String URI for the database server.
#
# Returns nothing.
def initialize(options = {})
@db = (url = options[:url]) ?
Sequel.connect(url) :
Sequel.sqlite
end
# Public: Finds the user record.
#
# username - The String Instagram username.
#
# Returns a Hash of the user attributes, or nil.
def find(username)
return if username.to_s.empty?
@db[:users].where(:username => username).first
end
# Public: Approves the given user and assigns their OAuth token.
#
# username - The String Instagram username.
# token - The String OAuth token.
#
# Returns true if the user is approved, or false.
def approve(username, token)
return false if username.to_s.empty? ||
token.to_s.empty?
num = @db[:users].
where(:username => username).
update(:token => token)
if num > 1
raise "Multiple users named #{username.inspect}"
else
num == 1
end
end
# Public: Inserts the given user data into the db.
#
# username - The String Instagram username.
# token - the optional String OAuth token.
#
# Returns false if the username is blank, or true.
def insert(username, token = nil)
return false if username.to_s.empty?
@db[:users].insert :username => username, :token => token
rescue Sequel::DatabaseError
false
end
# Public: Removes the user from the db.
#
# username - The String Instagram username.
#
# Returns false if the username is blank, or true.
def remove(username)
return false if username.to_s.empty?
@db[:users].where(:username => username).delete && true
rescue Sequel::DatabaseError
false
end
# Lists all users.
#
# Returns an Array of Hashes.
def users
@db[:users].all
end
# Creates the database tables.
#
# Returns nothing.
def setup
@db.create_table :users do
primary_key :id
String :username, :unique => true, :null => false
String :token
end
end
end
end
end