function main($in_dir, $out_dir)
{
    require_once __DIR__ . "/app.php";
    $files_parsed = 0;
    $postData = new Aruna\Micropub\PostData();
    foreach (list_files($in_dir) as $file) {
        // read post_data
        $in_filename = $file[0];
        $out_filename = $out_dir . "/" . basename($in_filename, ".json") . ".html";
        $post_data = json_decode(file_get_contents($in_filename), true);
        // convert mf json to viewModel
        $view_model = new Aruna\PostViewModel($postData->toMfArray($post_data));
        // render viewModel as html
        $post_html = $app['twig']->render("post_" . $view_model->type() . ".html", array("post" => $view_model));
        file_put_contents($out_filename, $post_html);
        $files_parsed += 1;
    }
    print sprintf("Processed %s files", $files_parsed);
}
 public function findById($post_id)
 {
     // current
     $q = "SELECT\n            id,\n            published,\n            date_deleted,\n            post\n            FROM posts\n            WHERE id = :id";
     $r = $this->db->prepare($q);
     $r->execute([":id" => $post_id]);
     $post = $r->fetch();
     if ($post === false) {
         return array();
     }
     $post = new \Aruna\PostViewModel(json_decode($post['post'], true), $post['date_deleted']);
     foreach ($this->findMentionsByPostId($post_id) as $mention) {
         if ($mention->type() == "reply") {
             $post->setComment($mention);
         }
     }
     foreach ($this->findMentionsByPostId($post_id) as $mention) {
         if ($mention->type() == "like") {
             $post->setLike($mention);
         }
     }
     $out = array($post);
     return $out;
 }