route.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { NextResponse } from 'next/server'
  2. import semver from 'semver'
  3. import { Octokit } from '@octokit/rest'
  4. import { RequestError } from '@octokit/types'
  5. const octokit = new Octokit()
  6. export async function GET(req: Request) {
  7. const { searchParams } = new URL(req.url)
  8. const os = searchParams.get('os') || ''
  9. const version = searchParams.get('version') || ''
  10. if (!version) {
  11. return new Response('not found', { status: 404 })
  12. }
  13. try {
  14. const { data } = await octokit.repos.getLatestRelease({
  15. owner: 'jmorganca',
  16. repo: 'ollama',
  17. })
  18. // todo: get the correct asset for the current arch/os
  19. const asset = data.assets.find(a => a.name.toLowerCase().includes(os))
  20. if (!asset) {
  21. return new Response('not found', { status: 404 })
  22. }
  23. if (semver.lt(version, data.tag_name)) {
  24. return NextResponse.json({ version: data.tag_name, url: asset.browser_download_url })
  25. }
  26. return new Response('up to date', { status: 204 })
  27. } catch (error) {
  28. const e = error as RequestError
  29. if (e.status === 404) {
  30. return new Response('not found', { status: 404 })
  31. }
  32. return new Response('internal server error', { status: 500 })
  33. }
  34. }