250 lines
10 KiB
PHP
250 lines
10 KiB
PHP
<?php
|
|
namespace Misuzu;
|
|
|
|
use Misuzu\Template;
|
|
use Misuzu\Config\IConfig;
|
|
use Misuzu\GeoIP\GeoIPHelper;
|
|
use Misuzu\SharpChat\SharpChatRoutes;
|
|
use Misuzu\Users\Users;
|
|
use Misuzu\Twitter\TwitterClient;
|
|
use Misuzu\Twitter\TwitterRoutes;
|
|
use Index\Data\IDbConnection;
|
|
use Index\Data\Migration\IDbMigrationRepo;
|
|
use Index\Data\Migration\DbMigrationManager;
|
|
use Index\Data\Migration\FsDbMigrationRepo;
|
|
use Index\Http\HttpFx;
|
|
use Index\Http\HttpRequest;
|
|
use Index\Routing\Router;
|
|
|
|
// this class should function as the root for everything going forward
|
|
// no more magical static classes that are just kind of assumed to exist
|
|
// it currently looks Pretty Messy, but most everything else will be holding instances of other classes
|
|
class MisuzuContext {
|
|
private IDbConnection $dbConn;
|
|
private IConfig $config;
|
|
private Users $users;
|
|
private HttpFx $router;
|
|
private ?GeoIPHelper $geoIP = null;
|
|
|
|
public function __construct(IDbConnection $dbConn, IConfig $config) {
|
|
$this->dbConn = $dbConn;
|
|
$this->config = $config;
|
|
$this->users = new Users($this->dbConn);
|
|
}
|
|
|
|
public function getDbQueryCount(): int {
|
|
$result = $this->dbConn->query('SHOW SESSION STATUS LIKE "Questions"');
|
|
return $result->next() ? $result->getInteger(0) : 0;
|
|
}
|
|
|
|
public function createMigrationManager(): DbMigrationManager {
|
|
return new DbMigrationManager($this->dbConn, 'msz_' . DbMigrationManager::DEFAULT_TABLE);
|
|
}
|
|
|
|
public function createMigrationRepo(): IDbMigrationRepo {
|
|
return new FsDbMigrationRepo(MSZ_MIGRATIONS);
|
|
}
|
|
|
|
public function getConfig(): IConfig {
|
|
return $this->config;
|
|
}
|
|
|
|
public function getRouter(): Router {
|
|
return $this->router->getRouter();
|
|
}
|
|
|
|
/*public function getUsers(): Users {
|
|
return $this->users;
|
|
}*/
|
|
|
|
public function getGeoIP(): GeoIPHelper {
|
|
if($this->geoIP === null)
|
|
return $this->geoIP = new GeoIPHelper($this->config->scopeTo('geoip'));
|
|
return $this->geoIP;
|
|
}
|
|
|
|
public function createTwitterClient(): TwitterClient {
|
|
return TwitterClient::create($this->config->scopeTo('twitter'));
|
|
}
|
|
|
|
public function setUpHttp(bool $legacy = false): void {
|
|
$this->router = new HttpFx;
|
|
$this->router->use('/', function($response) {
|
|
$response->setPoweredBy('Misuzu');
|
|
});
|
|
|
|
$this->registerErrorPages();
|
|
|
|
if($legacy)
|
|
$this->registerLegacyRedirects();
|
|
else
|
|
$this->registerHttpRoutes();
|
|
}
|
|
|
|
public function dispatchHttp(?HttpRequest $request = null): void {
|
|
$this->router->dispatch($request);
|
|
}
|
|
|
|
private function registerErrorPages(): void {
|
|
$this->router->addErrorHandler(400, function($response) {
|
|
$response->setContent(Template::renderRaw('errors.400'));
|
|
});
|
|
$this->router->addErrorHandler(403, function($response) {
|
|
$response->setContent(Template::renderRaw('errors.403'));
|
|
});
|
|
$this->router->addErrorHandler(404, function($response) {
|
|
$response->setContent(Template::renderRaw('errors.404'));
|
|
});
|
|
$this->router->addErrorHandler(500, function($response) {
|
|
$response->setContent(file_get_contents(MSZ_TEMPLATES . '/500.html'));
|
|
});
|
|
$this->router->addErrorHandler(503, function($response) {
|
|
$response->setContent(file_get_contents(MSZ_TEMPLATES . '/503.html'));
|
|
});
|
|
}
|
|
|
|
private function registerHttpRoutes(): void {
|
|
function msz_compat_handler(string $className, string $method) {
|
|
return function(...$args) use ($className, $method) {
|
|
$className = "\\Misuzu\\Http\\Handlers\\{$className}Handler";
|
|
return (new $className)->{$method}(...$args);
|
|
};
|
|
}
|
|
|
|
$this->router->get('/', msz_compat_handler('Home', 'index'));
|
|
|
|
$this->router->get('/assets/:filename', msz_compat_handler('Assets', 'serveComponent'));
|
|
$this->router->get('/assets/avatar/:filename', msz_compat_handler('Assets', 'serveAvatar'));
|
|
$this->router->get('/assets/profile-background/:filename', msz_compat_handler('Assets', 'serveProfileBackground'));
|
|
|
|
$this->router->get('/info', msz_compat_handler('Info', 'index'));
|
|
$this->router->get('/info/:name', msz_compat_handler('Info', 'page'));
|
|
$this->router->get('/info/:project/:name', msz_compat_handler('Info', 'page'));
|
|
|
|
$this->router->get('/changelog', msz_compat_handler('Changelog', 'index'));
|
|
$this->router->get('/changelog.rss', msz_compat_handler('Changelog', 'feedRss'));
|
|
$this->router->get('/changelog.atom', msz_compat_handler('Changelog', 'feedAtom'));
|
|
$this->router->get('/changelog/change/:id', msz_compat_handler('Changelog', 'change'));
|
|
|
|
$this->router->get('/news', msz_compat_handler('News', 'index'));
|
|
$this->router->get('/news.rss', msz_compat_handler('News', 'feedIndexRss'));
|
|
$this->router->get('/news.atom', msz_compat_handler('News', 'feedIndexAtom'));
|
|
$this->router->get('/news/:category', msz_compat_handler('News', 'viewCategory'));
|
|
$this->router->get('/news/post/:id', msz_compat_handler('News', 'viewPost'));
|
|
|
|
$this->router->get('/forum/mark-as-read', msz_compat_handler('Forum', 'markAsReadGET'));
|
|
$this->router->post('/forum/mark-as-read', msz_compat_handler('Forum', 'markAsReadPOST'));
|
|
|
|
new SharpChatRoutes($this->router, $this->config->scopeTo('sockChat'));
|
|
new TwitterRoutes($this, $this->router, $this->config->scopeTo('twitter'));
|
|
}
|
|
|
|
private function registerLegacyRedirects(): void {
|
|
$this->router->get('/index.php', function($response) {
|
|
$response->redirect(url('index'), true);
|
|
});
|
|
|
|
$this->router->get('/info.php', function($response) {
|
|
$response->redirect(url('info'), true);
|
|
});
|
|
|
|
$this->router->get('/settings.php', function($response) {
|
|
$response->redirect(url('settings-index'), true);
|
|
});
|
|
|
|
$this->router->get('/changelog.php', function($response, $request) {
|
|
$changeId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT);
|
|
if($changeId) {
|
|
$response->redirect(url('changelog-change', ['change' => $changeId]), true);
|
|
return;
|
|
}
|
|
|
|
$response->redirect(url('changelog-index', [
|
|
'date' => $request->getParam('d'),
|
|
'user' => $request->getParam('u', FILTER_SANITIZE_NUMBER_INT),
|
|
]), true);
|
|
});
|
|
|
|
$infoRedirect = function($response, $request, string ...$parts) {
|
|
$response->redirect(url('info', ['title' => implode('/', $parts)]), true);
|
|
};
|
|
$this->router->get('/info.php/:name', $infoRedirect);
|
|
$this->router->get('/info.php/:project/:name', $infoRedirect);
|
|
|
|
$this->router->get('/auth.php', function($response, $request) {
|
|
$response->redirect(url([
|
|
'logout' => 'auth-logout',
|
|
'reset' => 'auth-reset',
|
|
'forgot' => 'auth-forgot',
|
|
'register' => 'auth-register',
|
|
][$request->getParam('m')] ?? 'auth-login'), true);
|
|
});
|
|
|
|
$this->router->get('/news.php', function($response, $request) {
|
|
$postId = $request->getParam('n', FILTER_SANITIZE_NUMBER_INT) ?? $request->getParam('p', FILTER_SANITIZE_NUMBER_INT);
|
|
|
|
if($postId > 0)
|
|
$location = url('news-post', ['post' => $postId]);
|
|
else {
|
|
$catId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT);
|
|
$pageId = $request->getParam('page', FILTER_SANITIZE_NUMBER_INT);
|
|
$location = url($catId > 0 ? 'news-category' : 'news-index', ['category' => $catId, 'page' => $pageId]);
|
|
}
|
|
|
|
$response->redirect($location, true);
|
|
});
|
|
|
|
$this->router->get('/news.php/rss', function($response, $request) {
|
|
$catId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT);
|
|
$location = url($catId > 0 ? 'news-category-feed-rss' : 'news-feed-rss', ['category' => $catId]);
|
|
$response->redirect($location, true);
|
|
});
|
|
|
|
$this->router->get('/news.php/atom', function($response, $request) {
|
|
$catId = $request->getParam('c', FILTER_SANITIZE_NUMBER_INT);
|
|
$location = url($catId > 0 ? 'news-category-feed-atom' : 'news-feed-atom', ['category' => $catId]);
|
|
$response->redirect($location, true);
|
|
});
|
|
|
|
$this->router->get('/news/index.php', function($response) {
|
|
$response->redirect(url('news-index', [
|
|
'page' => $request->getParam('page', FILTER_SANITIZE_NUMBER_INT),
|
|
]), true);
|
|
});
|
|
|
|
$this->router->get('/news/category.php', function($response, $request) {
|
|
$response->redirect(url('news-category', [
|
|
'category' => $request->getParam('c', FILTER_SANITIZE_NUMBER_INT),
|
|
'page' => $request->getParam('p', FILTER_SANITIZE_NUMBER_INT),
|
|
]), true);
|
|
});
|
|
|
|
$this->router->get('/news/post.php', function($response, $request) {
|
|
$response->redirect(url('news-post', [
|
|
'post' => $request->getParam('p', FILTER_SANITIZE_NUMBER_INT),
|
|
]), true);
|
|
});
|
|
|
|
$this->router->get('/news/feed.php', function() {
|
|
return 400;
|
|
});
|
|
|
|
$this->router->get('/news/feed.php/rss', function($response, $request) {
|
|
$response->redirect(url(
|
|
$catId > 0 ? 'news-category-feed-rss' : 'news-feed-rss',
|
|
['category' => $request->getParam('c', FILTER_SANITIZE_NUMBER_INT)]
|
|
), true);
|
|
});
|
|
|
|
$this->router->get('/news/feed.php/atom', function($response, $request) {
|
|
$response->redirect(url(
|
|
$catId > 0 ? 'news-category-feed-atom' : 'news-feed-atom',
|
|
['category' => $request->getParam('c', FILTER_SANITIZE_NUMBER_INT)]
|
|
), true);
|
|
});
|
|
|
|
$this->router->get('/user-assets.php', function($response, $request) {
|
|
return (new \Misuzu\Http\Handlers\AssetsHandler)->serveLegacy($response, $request);
|
|
});
|
|
}
|
|
}
|