Closed falgon closed 1 month ago
graph TD; app1((stack exec site -- build))-->|"lookupEnv #quot;GITHUB_TOKEN#quot;"|Q1{Does it exist?} Q1-->|Yes|app2["Calling API with GraphQL"] Q1-->|No|app3["loadProjects (from Dhall file)"] app2-->|Request|G[(GitHub)] G-->Q2{Is it success?} Q2-->|Yes|A[Return pinned repositories] A-->D[Dhall format] Q2-->|No|app3 app3-->D D-->|Rendering|s[Built projects page] click app3 "https://github.com/falgon/roki-web/blob/c2d3eb791b675e71a315f46cf70a75d56f5a4227/src/Config/Contributions.hs#L41-42" "link" click D "https://github.com/falgon/roki-web/blob/c2d3eb791b675e71a315f46cf70a75d56f5a4227/src/Config/Contributions.hs#L50-55" "link"
calling API need to use GraphQL, cf. https://zenn.dev/yutakobayashi/articles/github-graphql-api-pin-repository
{ user(login: "your-github-id") { pinnedItems(types: REPOSITORY, first: 6) { nodes { ... on Repository { url name description stargazerCount languages(orderBy: {field: SIZE, direction: DESC}, first: 1) { nodes { name color } } } } } } }
so, Haskell implementation should be...
{-# LANGUAGE DeriveGeneric, DerivingStrategies, DuplicateRecordFields, OverloadedStrings, QuasiQuotes, TemplateHaskell, TypeFamilies #-} import Data.Aeson.Types import Data.Aeson.Types.FromJSON import Data.Morpheus.Client (declareLocalTypesInline, raw) import Data.Text (Text) import Network.URI declareLocalTypesInline "./tools/github/schema.docs.graphql" [raw| query GetPinnedRepos($user: String!) { user(login: $user) { pinnedItems(types: REPOSITORY, first: 6) { nodes { ... on Repository { __typename url name description stargazerCount languages(orderBy: {field: SIZE, direction: DESC}, first: 1) { nodes { name color } } } } } } } |]
FromJSON URI
extra-deps: - aeson-2.2.3.0@sha256:ef66d29cb5b8d87a144838dfd5745bb3ac6b8fc4b142129fac84814baee13660,6351
Summary
calling API need to use GraphQL, cf. https://zenn.dev/yutakobayashi/articles/github-graphql-api-pin-repository
so, Haskell implementation should be...
FromJSON URI
, this declarative begin from aeson v2.2.3.0 but lts-22.29 includes aeson v2.1.2.1For that reason, I have given up on using the nightly version and plan to implement it after it is included in LTS.References