Don't forget to lycansubscribe

added API endpoint for search (dev mode)

Changed files
+71
app
bin
+7
Gemfile
··· 7 gem 'irb' 8 gem 'rainbow' 9 10 gem 'minisky', '~> 0.5' 11 gem 'didkit', '~> 0.2', git: 'https://tangled.sh/@mackuba.eu/didkit'
··· 7 gem 'irb' 8 gem 'rainbow' 9 10 + gem 'sinatra' 11 + 12 gem 'minisky', '~> 0.5' 13 gem 'didkit', '~> 0.2', git: 'https://tangled.sh/@mackuba.eu/didkit' 14 + 15 + group :development do 16 + gem 'puma' 17 + gem 'rackup' 18 + end
+8
Gemfile.lock
··· 46 minitest (5.25.5) 47 mustermann (3.0.4) 48 ruby2_keywords (~> 0.0.1) 49 pg (1.6.1) 50 pg (1.6.1-aarch64-linux) 51 pg (1.6.1-aarch64-linux-musl) ··· 59 psych (5.2.6) 60 date 61 stringio 62 rack (3.2.0) 63 rack-protection (4.1.1) 64 base64 (>= 0.1.0) ··· 67 rack-session (2.1.1) 68 base64 (>= 0.1.0) 69 rack (>= 3.0.0) 70 rainbow (3.1.1) 71 rake (13.3.0) 72 rdoc (6.14.2) ··· 107 irb 108 minisky (~> 0.5) 109 pg 110 rainbow 111 rake 112 sinatra-activerecord (~> 2.0) 113 114 BUNDLED WITH
··· 46 minitest (5.25.5) 47 mustermann (3.0.4) 48 ruby2_keywords (~> 0.0.1) 49 + nio4r (2.7.4) 50 pg (1.6.1) 51 pg (1.6.1-aarch64-linux) 52 pg (1.6.1-aarch64-linux-musl) ··· 60 psych (5.2.6) 61 date 62 stringio 63 + puma (6.6.1) 64 + nio4r (~> 2.0) 65 rack (3.2.0) 66 rack-protection (4.1.1) 67 base64 (>= 0.1.0) ··· 70 rack-session (2.1.1) 71 base64 (>= 0.1.0) 72 rack (>= 3.0.0) 73 + rackup (2.2.1) 74 + rack (>= 3) 75 rainbow (3.1.1) 76 rake (13.3.0) 77 rdoc (6.14.2) ··· 112 irb 113 minisky (~> 0.5) 114 pg 115 + puma 116 + rackup 117 rainbow 118 rake 119 + sinatra 120 sinatra-activerecord (~> 2.0) 121 122 BUNDLED WITH
+4
app/models/post.rb
··· 11 validates_length_of :data, maximum: 10000 12 13 belongs_to :user 14 end
··· 11 validates_length_of :data, maximum: 10000 12 13 belongs_to :user 14 + 15 + def at_uri 16 + "at://#{user.did}/app.bsky.feed.post/#{rkey}" 17 + end 18 end
+44
app/server.rb
···
··· 1 + require 'json' 2 + require 'sinatra/base' 3 + 4 + require_relative 'init' 5 + require_relative 'models/like' 6 + require_relative 'models/user' 7 + 8 + class Server < Sinatra::Application 9 + register Sinatra::ActiveRecordExtension 10 + set :port, 3000 11 + 12 + PAGE_LIMIT = 5 13 + 14 + helpers do 15 + def json_response(data) 16 + content_type :json 17 + JSON.generate(data) 18 + end 19 + 20 + def json_error(name, message, status: 400) 21 + content_type :json 22 + [status, JSON.generate({ error: name, message: message })] 23 + end 24 + end 25 + 26 + get '/xrpc/blue.feeds.lycan.searchPosts' do 27 + headers['access-control-allow-origin'] = '*' 28 + 29 + if settings.development? 30 + user = User.find_by(did: params[:user]) 31 + return json_error('UserNotFound', 'Missing "user" parameter') if user.nil? 32 + end 33 + 34 + if params[:query] 35 + query = params[:query].gsub('%', "\\%") 36 + likes = user.likes.joins(:post).includes(:post => :user).where("text ILIKE ?", "%#{query}%").order('likes.time DESC').limit(PAGE_LIMIT) 37 + post_uris = likes.map(&:post).map(&:at_uri) 38 + 39 + json_response(posts: post_uris) 40 + else 41 + json_error('MissingParameter', 'Missing "query" parameter') 42 + end 43 + end 44 + end
+8
bin/server
···
··· 1 + #!/usr/bin/env ruby 2 + 3 + $LOAD_PATH.unshift(File.expand_path('..', __dir__)) 4 + 5 + require 'bundler/setup' 6 + require 'app/server' 7 + 8 + Server.run!