aboutsummaryrefslogtreecommitdiff
path: root/src/indrajith-dev-crystal.cr
blob: f49f13414b0b1664695bf5dbe482af786a48a417 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
require "kemal"
require "crest"
require "json"
require "dotenv"
require "./utils/utils"
require "time"

Dotenv.load

TOKEN = ENV["TOKEN"]
STRAPI_URL = ENV["STRAPI_URL"]

module Indrajith::Dev::Crystal
  VERSION = "0.1.0"

  macro page_renderer(filename, title)
    page_title = {{title}}
    published_at=""
    render "src/views/#{{{filename}}}.ecr", "src/views/layout.ecr"
  end

  macro render_404()
    page_renderer "404", "The VOID"
  end


  get "/" do |context|
    context.response.content_type = "text/html"
    page_renderer "home", "Home"
  end

  get "/about" do |context|
    context.response.content_type = "text/html"
    page_renderer "about", "About "
  end

  get "/timeline" do |context|
    context.response.content_type = "text/html"
    page_renderer "timeline", "Timeline"
  end

  get "/contact" do |context|
    context.response.content_type = "text/html"
    page_renderer "contact", "Contact"
  end

  get "/blog" do |context|
    context.response.content_type = "text/html"
    page_renderer "blog", "Blog"
  end

  get "/posts" do |context|
    begin
      site = Crest::Resource.new("#{STRAPI_URL}")

      response = site.get("/api/posts",
        params: {
          "fields[0]"            => "post_title",
          "fields[1]"            => "slug",
          "pagination[pageSize]" => 3,
        },
        headers: {"Authorization" => "Bearer #{TOKEN}"}
      )

      json_data = JSON.parse(response.body)
      data = json_data["data"].as_a
      puts data.size
      if data.size == 0
        "<li>No Posts Yet</li>"
      else
        html_string = ""
        data.each do |item|
          attributes = item["attributes"]
          # puts attributes["post_title"]
          html_string += "
          <li>
            <p><a href='/post/#{attributes["slug"]}'>#{attributes["post_title"]}</a></p>
          </li>"
        end
        html_string
      end
    rescue ex : Crest::NotFound
      puts ex.response
      render_404
    end
  end

  get "/post/:slug" do |context|
    begin
      slug = context.params.url["slug"]
      site = Crest::Resource.new("#{STRAPI_URL}")

      response = site.get("/api/posts",
        params: {
          "filters[slug][$eq]" => "#{slug}",
        },
        headers: {"Authorization" => "Bearer #{TOKEN}"}
      )

      json_data = JSON.parse(response.body)
      data = json_data["data"].as_a
      post_item = data[0]
      post_attribute = post_item["attributes"]
      content = post_attribute["post_content"]
      published_raw_time = post_attribute["publishedAt"].as_s
      published_time = Time.parse(published_raw_time, "%Y-%m-%dT%H:%M:%S.%3NZ", Time::Location.local)
      published_at = format_date(published_time)
      page_title = post_attribute["post_title"]
      render "src/views/layout.ecr"
    rescue ex
      puts ex
      render_404
    end
  end

  error 404 do |context|
    context.response.content_type = "text/html"
    render_404
  end

  Kemal.run
end