Skip to content

Commit 793e437

Browse files
committed
refactor Swiftinit.PipelineEndpoint into protocols
1 parent 51ee991 commit 793e437

File tree

57 files changed

+1240
-704
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1240
-704
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ let package:Package = .init(
9595

9696
.package(url: "https://github.com/tayloraswift/swift-hash", .upToNextMinor(
9797
from: "0.5.0")),
98-
.package(url: "https://github.com/tayloraswift/swift-mongodb", .upToNextMinor(
99-
from: "0.9.1")),
98+
// .package(url: "https://github.com/tayloraswift/swift-mongodb", .upToNextMinor(
99+
// from: "0.9.1")),
100+
.package(url: "https://github.com/tayloraswift/swift-mongodb",
101+
branch: "0.10.0"),
100102

101103
.package(url: "https://github.com/apple/swift-atomics", .upToNextMinor(
102104
from: "1.2.0")),
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Media
2+
3+
@available(*, deprecated, renamed: "HTTP.ServerEndpoint")
4+
public
5+
typealias ServerResponseFactory = HTTP.ServerEndpoint
6+
7+
extension HTTP
8+
{
9+
public
10+
typealias ServerEndpoint = _HTTPServerEndpoint
11+
}
12+
13+
/// The name of this protocol is ``HTTP.ServerEndpoint``.
14+
public
15+
protocol _HTTPServerEndpoint<Format>
16+
{
17+
associatedtype Format
18+
19+
consuming
20+
func response(as format:Format) throws -> HTTP.ServerResponse
21+
}

Sources/HTTP/HTTP.ServerResponseFactory.swift

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import HTTP
2+
import JSON
3+
import Media
4+
import MongoDB
5+
import SwiftinitRender
6+
import UnidocDB
7+
import UnidocQueries
8+
import UnidocRecords
9+
10+
extension Swiftinit
11+
{
12+
@frozen public
13+
struct TagsEndpoint:Mongo.PipelineEndpoint, Mongo.SingleOutputEndpoint
14+
{
15+
public
16+
let query:Unidoc.PackageQuery
17+
public
18+
var value:Unidoc.PackageQuery.Output?
19+
20+
@inlinable public
21+
init(query:Unidoc.PackageQuery)
22+
{
23+
self.query = query
24+
self.value = nil
25+
}
26+
}
27+
}
28+
extension Swiftinit.TagsEndpoint:HTTP.ServerEndpoint
29+
{
30+
public consuming
31+
func response(as format:Swiftinit.RenderFormat) -> HTTP.ServerResponse
32+
{
33+
guard
34+
let output:Unidoc.PackageQuery.Output = self.value
35+
else
36+
{
37+
return .error("Query for endpoint '\(Self.self)' returned no outputs!")
38+
}
39+
40+
switch format.accept
41+
{
42+
case .application(.json):
43+
guard
44+
let status:Unidoc.PackageStatus = .init(from: output)
45+
else
46+
{
47+
return .notFound(.init(content: .string(""),
48+
type: .text(.plain, charset: .utf8)))
49+
}
50+
51+
let json:JSON = .object(with: status.encode(to:))
52+
53+
return .ok(.init(
54+
content: .binary(json.utf8),
55+
type: .application(.json, charset: .utf8)))
56+
57+
case _:
58+
let page:Swiftinit.TagsPage = .init(from: output)
59+
return .ok(page.resource(format: format))
60+
}
61+
}
62+
}

Sources/SwiftinitPages/Surfaces/Editions/Unidoc.PackageQuery.Output (ext).swift

Lines changed: 0 additions & 35 deletions
This file was deleted.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import HTTP
2+
import MongoDB
3+
import SwiftinitRender
4+
import UnidocDB
5+
import UnidocQueries
6+
7+
extension Swiftinit
8+
{
9+
@frozen public
10+
struct RealmEndpoint:Mongo.PipelineEndpoint, Mongo.SingleOutputEndpoint
11+
{
12+
public
13+
let query:Unidoc.RealmQuery
14+
public
15+
var value:Unidoc.RealmQuery.Output?
16+
17+
@inlinable public
18+
init(query:Unidoc.RealmQuery)
19+
{
20+
self.query = query
21+
self.value = nil
22+
}
23+
}
24+
}
25+
extension Swiftinit.RealmEndpoint:HTTP.ServerEndpoint
26+
{
27+
public consuming
28+
func response(as format:Swiftinit.RenderFormat) -> HTTP.ServerResponse
29+
{
30+
guard
31+
let output:Unidoc.RealmQuery.Output = self.value
32+
else
33+
{
34+
return .error("Query for endpoint '\(Self.self)' returned no outputs!")
35+
}
36+
37+
let page:Swiftinit.RealmPage = .init(from: output)
38+
return .ok(page.resource(format: format))
39+
}
40+
}

Sources/SwiftinitPages/Surfaces/Realms/Unidoc.RealmQuery.Output (ext).swift

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import HTTP
2+
import Media
3+
import MongoDB
4+
import SwiftinitRender
5+
import UnidocDB
6+
import UnidocQueries
7+
8+
extension Swiftinit
9+
{
10+
@frozen public
11+
struct HomeEndpoint:Mongo.PipelineEndpoint, Mongo.SingleOutputEndpoint
12+
{
13+
public
14+
let query:Unidoc.ActivityQuery
15+
public
16+
var value:Unidoc.ActivityQuery.Output?
17+
18+
@inlinable public
19+
init(query:Unidoc.ActivityQuery)
20+
{
21+
self.query = query
22+
self.value = nil
23+
}
24+
}
25+
}
26+
extension Swiftinit.HomeEndpoint:HTTP.ServerEndpoint
27+
{
28+
public consuming
29+
func response(as format:Swiftinit.RenderFormat) -> HTTP.ServerResponse
30+
{
31+
guard
32+
let output:Unidoc.ActivityQuery.Output = self.value
33+
else
34+
{
35+
return .error("Query for endpoint '\(Self.self)' returned no outputs!")
36+
}
37+
38+
let page:Swiftinit.HomePage = .init(
39+
repo: output.repo,
40+
docs: output.docs)
41+
42+
return .ok(page.resource(format: format))
43+
}
44+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import HTTP
2+
import Media
3+
import MongoDB
4+
import SwiftinitRender
5+
import UnidocDB
6+
import UnidocQueries
7+
import UnidocRecords
8+
import URI
9+
10+
extension Swiftinit
11+
{
12+
@frozen public
13+
struct SitemapEndpoint:Mongo.PipelineEndpoint, Mongo.SingleOutputEndpoint
14+
{
15+
public
16+
let query:Unidoc.SitemapQuery
17+
public
18+
var value:Unidoc.SitemapQuery.Output?
19+
20+
@inlinable public
21+
init(query:Unidoc.SitemapQuery)
22+
{
23+
self.query = query
24+
self.value = nil
25+
}
26+
}
27+
}
28+
extension Swiftinit.SitemapEndpoint:HTTP.ServerEndpoint
29+
{
30+
/// Generates a plain text sitemap for the given package.
31+
///
32+
/// We don’t have granular enough `<lastmod>` information to motivate generating XML
33+
/// sitemaps, and all other XML sitemap features (like `<priority>`) are irrelevant to us,
34+
/// since Google ignores them. Therefore, we use the plain text format.
35+
public consuming
36+
func response(as _:Swiftinit.RenderFormat) -> HTTP.ServerResponse
37+
{
38+
guard
39+
let output:Unidoc.SitemapQuery.Output = self.value
40+
else
41+
{
42+
return .error("Query for endpoint '\(Self.self)' returned no outputs!")
43+
}
44+
45+
let prefix:String = "https://swiftinit.org/\(Swiftinit.Docs.root)/\(output.package)"
46+
var string:String = ""
47+
48+
for page:Unidoc.Shoot in output.sitemap.elements
49+
{
50+
var uri:URI = []
51+
52+
uri.path += page.stem
53+
uri["hash"] = page.hash?.description
54+
55+
string += "\(prefix)\(uri)\n"
56+
}
57+
58+
return .ok(.init(content: .string(string),
59+
type: .text(.plain, charset: .utf8),
60+
hash: output.sitemap.hash))
61+
}
62+
}

0 commit comments

Comments
 (0)