app.rb 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. require 'flickr/login'
  2. require 'flickraw'
  3. require 'pry'
  4. require 'sinatra'
  5. require 'sinatra/config_file'
  6. require 'sinatra/json'
  7. require 'sinatra/reloader'
  8. require 'sinatra/sequel'
  9. config_file 'config.yml'
  10. enable :sessions
  11. set :database, 'sqlite://db.sqlite3'
  12. migration 'create users, licenses, and photos tables' do
  13. database.create_table :users do
  14. column :nsid, String, primary_key: true
  15. column :username, String
  16. column :fullname, String
  17. end
  18. database.create_table :licenses do
  19. column :id, Integer, primary_key: true
  20. column :name, String
  21. column :url, String
  22. end
  23. database.create_table :photos do
  24. column :id, Integer, primary_key: true
  25. # foreign_key :user_id, :users, on_delete: :cascade, on_update: :restrict
  26. foreign_key :owner, :users
  27. # foreign_key :license_id, :licenses, on_delete: :cascade, on_update: :restrict
  28. foreign_key :license, :licenses
  29. column :json, 'text'
  30. column :ignore, 'boolean'
  31. end
  32. end
  33. migration 'rename photo owner and license columns to user_id and license_id' do
  34. database.alter_table :photos do
  35. drop_foreign_key [:owner]
  36. rename_column :owner, :user_id
  37. add_foreign_key [:user_id], :users
  38. drop_foreign_key [:license]
  39. rename_column :license, :license_id
  40. add_foreign_key [:license_id], :licenses
  41. end
  42. end
  43. migration 'add on delete and update constraints to photo user_id and license_id' do
  44. database.alter_table :photos do
  45. drop_foreign_key [:user_id]
  46. add_foreign_key [:user_id], :users, on_delete: :cascade, on_update: :restrict
  47. drop_foreign_key [:license_id]
  48. add_foreign_key [:license_id], :licenses, on_delete: :cascade, on_update: :restrict
  49. end
  50. end
  51. class User < Sequel::Model
  52. one_to_many :photo
  53. unrestrict_primary_key
  54. end
  55. class License < Sequel::Model
  56. one_to_many :photo
  57. unrestrict_primary_key
  58. def as_json(*)
  59. {
  60. id: id,
  61. name: name,
  62. url: url,
  63. }
  64. end
  65. def to_json(*args)
  66. as_json.to_json(*args)
  67. end
  68. end
  69. class Photo < Sequel::Model
  70. many_to_one :user
  71. many_to_one :license
  72. unrestrict_primary_key
  73. def flickraw
  74. @flickraw ||= OpenStruct.new(JSON.parse(json))
  75. end
  76. def as_json(*)
  77. {
  78. id: id,
  79. license: license_id,
  80. ignore: ignore,
  81. img: FlickRaw.url_q(flickraw),
  82. url: FlickRaw.url_photopage(flickraw),
  83. title: flickraw.title,
  84. public: flickraw.ispublic != 0,
  85. friend: flickraw.isfriend != 0,
  86. family: flickraw.isfamily != 0,
  87. }
  88. end
  89. def to_json(*args)
  90. as_json.to_json(*args)
  91. end
  92. end
  93. helpers Flickr::Login::Helpers
  94. helpers do
  95. def flickr
  96. unless @flickr
  97. @flickr = FlickRaw::Flickr.new(api_key: settings.flickr_api_key, shared_secret: settings.flickr_shared_secret)
  98. @flickr.access_token, @flickr.access_secret = flickr_access_token
  99. end
  100. @flickr
  101. end
  102. end
  103. before do
  104. redirect to('/login?perms=write') unless flickr_user
  105. @user = User.find_or_create(nsid: flickr_user[:user_nsid]) do |user|
  106. user.username = flickr_user[:username]
  107. user.fullname = flickr_user[:fullname]
  108. end
  109. end
  110. get '/' do
  111. @licenses = License.all
  112. @licenses = flickr.photos.licenses.getInfo.map do |flickr_license|
  113. License.create do |license|
  114. license.id = flickr_license.id
  115. license.name = flickr_license.name
  116. license.url = flickr_license.url
  117. end
  118. end if @licenses.count == 0
  119. erb :index
  120. end
  121. get '/logout' do
  122. flickr_clear
  123. redirect to('/')
  124. end
  125. get %r{/photos/([1-8])} do |page|
  126. page, per_page = page.to_i, 500
  127. photos = Photo.reverse(:id).limit(per_page, (page - 1) * per_page).all
  128. begin
  129. photos = flickr.photos.search(user_id: :me, extras: 'license', per_page: per_page, page: page).map do |flickr_photo|
  130. Photo.create do |photo|
  131. photo.id = flickr_photo.id
  132. photo.user_id = flickr_photo.owner
  133. photo.license_id = flickr_photo.license
  134. photo.json = flickr_photo.to_hash.to_json
  135. photo.ignore = false
  136. end
  137. end if photos.count == 0
  138. rescue Sequel::UniqueConstraintViolation
  139. # sometimes the Flickr API will just keep repeating the same results for subsequent pages
  140. end
  141. json path: "/photos/#{page + 1}", photos: photos if photos.count == per_page && page < 8
  142. json photos: photos
  143. end