data endpoint for entity 90008 (aka. a website)
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: fetching entry is actually correct now

+17 -19
+5 -13
guestbook/src/main/scala/systems/gaze/guestbook/Guestbook.scala
··· 32 32 os.read(config.entryCountPath).toInt 33 33 def read(config: Config, from: Int, count: Int): F[Page] = 34 34 val entryCount = entriesSize(config) 35 - // limit from to 1 cuz duh lol 36 - val startFrom = from.max(1) 37 - // limit count to however many entries there are 38 - val endAt = (startFrom + count - 1).min(entryCount).max(1) 39 - // if it wants us to start from after entries just return empty 40 - if startFrom > entryCount then 41 - return Page(entries = List.empty, hasNext = false).pure[F] 42 - logger.trace(s"want to read entries from $startFrom ($from) to $endAt ($from + $count)") 35 + val entryIds = (1 to entryCount).reverse.drop(from).take(count) 43 36 // actually get the entries 44 - val entries = (startFrom to endAt) 37 + val entries = entryIds 45 38 .map((no) => // read the entries 46 - val entryNo = entryCount - no + 1 47 - logger.trace(s"reading entry at $entryNo") 48 - entryNo -> decode[Entry](os.read(config.entriesPath / entryNo.toString)).getOrElse( 39 + logger.info(s"reading entry at $no") 40 + no -> decode[Entry](os.read(config.entriesPath / no.toString)).getOrElse( 49 41 Entry( 50 42 author = "error", 51 43 content = "woops, this is an error!", ··· 54 46 ) 55 47 ) 56 48 .toList 57 - Page(entries, hasNext = entryCount > endAt).pure[F] 49 + Page(entries, hasNext = entries.last._1 > 1).pure[F] 58 50 def write(config: Config, entry: Entry): F[Unit] = 59 51 val entryNo = entriesSize(config) + 1 60 52 val entryPath = config.entriesPath / entryNo.toString
+7 -3
guestbook/src/main/scala/systems/gaze/guestbook/GuestbookRoutes.scala
··· 32 32 def routes( 33 33 G: Guestbook[IO] 34 34 ): HttpRoutes[IO] = 35 - val putEntry = HttpRoutes.of[IO] { case req @ POST -> Root => 35 + val putEntry = HttpRoutes.of[IO] { 36 + case req @ POST -> Root => 36 37 for { 37 38 entry <- req.as[UrlForm].map { form => 38 39 val author = form.getFirstOrElse("author", "error") ··· 44 45 resp <- SeeOther(Location(websiteUri / "guestbook")) 45 46 } yield resp 46 47 } 47 - val getEntries = HttpRoutes.of[IO] { case GET -> Root / IntVar(page) => 48 + object OffsetParam extends QueryParamDecoderMatcher[Int]("offset") 49 + object CountParam extends QueryParamDecoderMatcher[Int]("count") 50 + val getEntries = HttpRoutes.of[IO] { 51 + case GET -> Root :? OffsetParam(offset) +& CountParam(count) => 48 52 for { 49 - entries <- G.read(guestbookConfig, (page - 1).max(0) * 5, 5) 53 + entries <- G.read(guestbookConfig, offset, count) 50 54 resp <- Ok(entries) 51 55 } yield resp 52 56 }
+4 -2
src/routes/guestbook/+page.server.ts
··· 115 115 data.page = Math.max(data.page, 1) 116 116 let respRaw: Response 117 117 try { 118 - respRaw = await fetch(`${GUESTBOOK_BASE_URL}/${data.page}`) 118 + const count = 5 119 + const offset = (data.page - 1) * count 120 + respRaw = await fetch(`${GUESTBOOK_BASE_URL}?offset=${offset}&count=${count}`) 119 121 } catch (err: any) { 120 122 data.getError = `${err.toString()} (is guestbook server running?)` 121 123 return data ··· 126 128 try { 127 129 body = await respRaw.json() 128 130 } catch (err: any) { 129 - data.getError = err.toString() 131 + data.getError = `invalid body? (${err.toString()})` 130 132 return data 131 133 } 132 134 data.entries = body.entries
+1 -1
src/routes/guestbook/+page.svelte
··· 94 94 {#if hasPreviousPage || hasNextPage} 95 95 <div class="flex flex-row w-full justify-center items-center font-monospace"> 96 96 {#if hasPreviousPage} 97 - <a href="/guestbook/?page={data.entries.length < 0 ? data.page - 1 : 1}" 97 + <a href="/guestbook/?page={data.entries.length > 0 ? data.page - 1 : 1}" 98 98 >&lt;&lt; previous</a 99 99 > 100 100 {/if}