Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .ameba.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Lint/UselessAssign:
Enabled: true
Excluded:
- src/web.cr
- src/routes/*

Lint/SpecFilename:
Excluded:
Expand Down
6 changes: 3 additions & 3 deletions shard.lock
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@ shards:
git: https://github.com/geocrystal/ipapi-crystal.git
version: 0.7.0

kemal:
kemal: # Overridden
git: https://github.com/kemalcr/kemal.git
version: 1.9.0
version: 1.9.0+git.commit.89966f6f7b4c3ce8e39def4aafa9b33257232a82

kemal-kilt:
git: https://github.com/crystal-garage/kemal-kilt.git
Expand Down Expand Up @@ -155,7 +155,7 @@ shards:

redis: # Overridden
git: https://github.com/jgaskins/redis.git
version: 0.15.2+git.commit.8d7064f844ecd51d7fd38d48b18860e0813c0788
version: 0.15.3+git.commit.d38bd79ed2c96d3f53f774485b4f5e1e8400e089

redis_cache_store:
git: https://github.com/crystal-cache/redis_cache_store.git
Expand Down
3 changes: 3 additions & 0 deletions shard.override.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ dependencies:
redis:
github: jgaskins/redis
branch: master
kemal:
github: kemalcr/kemal
branch: master
kemal-session:
github: kemalcr/kemal-session
branch: master
295 changes: 295 additions & 0 deletions src/routes/admin.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
router = Kemal::Router.new

router.namespace "/admin" do
before do |env|
unless (current_user = current_user(env)) && current_user.admin?
halt env, status_code: 403, response: "Forbidden"
end
end

get "/" do |env|
request_context = env.get("request_context").as(RequestContext)
request_context.page_title = "Admin:"
env.set "request_context", request_context

render "src/views/admin/index.slang", "src/views/layouts/layout.slang"
end

get "/admins" do |env|
page = env.params.query["page"]? || ""
page = page.to_i? || 1
per_page = 20
offset = (page - 1) * per_page

raise Kemal::Exceptions::RouteNotFound.new(env) if page < 1

admin_query = Admin.query.order_by(created_at: :desc)

total_count = admin_query.count

raise Kemal::Exceptions::RouteNotFound.new(env) if (page - 1) * per_page > total_count

paginator = ViewHelpers::Paginator.new(
page,
per_page,
total_count,
"/admin/admins&page=#{page}"
).to_s

admins = admin_query.limit(per_page).offset(offset)

set_request_context(env) do
request_context.page_title = "Admin: Site Admins"
end

render "src/views/admin/admins/index.slang", "src/views/layouts/layout.slang"
end

namespace "/repositories" do
get "/new" do |env|
set_request_context(env) do
request_context.page_title = "Admin: Add new repository"
end

render "src/views/admin/repositories/new.slang", "src/views/layouts/layout.slang"
end

post "/" do |env|
url = env.params.body["repository[url]"].as(String)

if repository = Helpers.sync_repository_by_url(url)
env.flash["notice"] = "Repository was successfully added."

env.redirect(repository.decorate.show_path)
else
env.flash["notice"] = "Something went wrong."

env.redirect("/admin/repositories/new")
end
end

post "/:id/sync" do |env|
id = env.params.url["id"]

if repository = Repository.find(id)
repository.resync!

env.flash["notice"] = "Repository was successfully synced."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/#{repository.provider}/#{repository.user.login}/#{repository.name}",
},
})
end
end

post "/:id/show" do |env|
id = env.params.url["id"]

if repository = Repository.find(id)
repository.update(ignore: false)

env.flash["notice"] = "Repository was successfully shown."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/#{repository.provider}/#{repository.user.login}/#{repository.name}",
},
})
end
end

post "/:id/hide" do |env|
id = env.params.url["id"]

if repository = Repository.find(id)
repository.update(ignore: true)

env.flash["notice"] = "Repository was successfully hidden."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/#{repository.provider}/#{repository.user.login}/#{repository.name}",
},
})
end
end

delete "/:id" do |env|
id = env.params.url["id"]

if repository = Repository.find(id)
repository.delete

env.flash["notice"] = "Repository was successfully destroyed."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/",
},
})
end
end
end

get "/hidden_users" do |env|
page = env.params.query["page"]? || ""
page = page.to_i? || 1
per_page = 20
offset = (page - 1) * per_page

raise Kemal::Exceptions::RouteNotFound.new(env) if page < 1

users_query =
User
.query
.join(:repositories)
.where { users.ignore.true? }
.select(
"users.*",
"COUNT(repositories.*) AS repositories_count",
)
.group_by("users.id")

total_count = users_query.count

raise Kemal::Exceptions::RouteNotFound.new(env) if (page - 1) * per_page > total_count

paginator = ViewHelpers::Paginator.new(
page,
per_page,
total_count,
"/admin/hidden_users&page=#{page}"
).to_s

users = users_query.limit(per_page).offset(offset)

set_request_context(env) do
request_context.page_title = "Admin: Hidden Users"
end

render "src/views/admin/hidden_users/index.slang", "src/views/layouts/layout.slang"
end

get "/hidden_repositories" do |env|
page = env.params.query["page"]? || ""
page = page.to_i? || 1
per_page = 20
offset = (page - 1) * per_page

raise Kemal::Exceptions::RouteNotFound.new(env) if page < 1

repositories_query =
Repository
.query
.with_user
.where { repositories.ignore.true? }
.order_by(stars_count: :desc)

total_count = repositories_query.count

raise Kemal::Exceptions::RouteNotFound.new(env) if (page - 1) * per_page > total_count

paginator = ViewHelpers::Paginator.new(
page,
per_page,
total_count,
"/admin/hidden_repositories&page=#{page}"
).to_s

repositories = repositories_query.limit(per_page).offset(offset)

set_request_context(env) do
request_context.page_title = "Admin: Hidden Repositories"
end

render "src/views/admin/hidden_repositories/index.slang", "src/views/layouts/layout.slang"
end

get "/active_users" do |env|
keys = ACTIVE_USERS_CACHE.keys

set_request_context(env) do
request_context.page_title = "Admin: Active Users"
end

render "src/views/admin/active_users/index.slang", "src/views/layouts/layout.slang"
end

namespace "/users" do
post "/:id/sync" do |env|
id = env.params.url["id"]

if user = User.find(id)
user.resync!

env.flash["notice"] = "User was successfully synced."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/#{user.provider}/#{user.login}",
},
})
end
end

delete "/:id" do |env|
id = env.params.url["id"]

if user = User.find(id)
user.delete

env.flash["notice"] = "User was successfully destroyed."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/",
},
})
end
end

post "/:id/show" do |env|
id = env.params.url["id"]

if user = User.find(id)
user.update(ignore: false)

env.flash["notice"] = "User was successfully shown."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/#{user.provider}/#{user.login}",
},
})
end
end

post "/:id/hide" do |env|
id = env.params.url["id"]

if user = User.find(id)
user.update(ignore: true)

env.flash["notice"] = "User was successfully hidden."

env.json({
"status" => "success",
"data" => {
"redirect_url" => "/#{user.provider}/#{user.login}",
},
})
end
end
end
end

mount router
Loading