Skip to content

Commit ca338de

Browse files
committed
create an endpoint for PUT-ing raw symbolgraphs to the server
1 parent 80a5983 commit ca338de

31 files changed

+493
-235
lines changed

Sources/HTTPServer/Channels/HTTPServerOperation.swift

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,33 @@ protocol HTTPServerOperation:Sendable
1818
address:SocketAddress?,
1919
headers:HTTPHeaders,
2020
body:[UInt8])
21+
22+
init?(put uri:String,
23+
address:SocketAddress?,
24+
headers:HTTPHeaders,
25+
body:[UInt8])
2126
}
2227
extension HTTPServerOperation
2328
{
2429
@inlinable public
25-
init?(_ uri:String,
30+
init?(get uri:String,
2631
address:SocketAddress?,
2732
headers:HTTPHeaders)
2833
{
2934
nil
3035
}
3136

3237
@inlinable public
33-
init?(_ uri:String,
38+
init?(post uri:String,
39+
address:SocketAddress?,
40+
headers:HTTPHeaders,
41+
body:[UInt8])
42+
{
43+
nil
44+
}
45+
46+
@inlinable public
47+
init?(put uri:String,
3448
address:SocketAddress?,
3549
headers:HTTPHeaders,
3650
body:[UInt8])

Sources/HTTPServer/Channels/ServerInterfaceHandler.swift

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ extension ServerInterfaceHandler:ChannelInboundHandler, RemovableChannelHandler
7777
self.send(message: .init(status: .badRequest), context: context)
7878
}
7979

80-
case .POST:
80+
case .POST, .PUT:
8181
self.request = (head, .init())
8282

8383
case _:
@@ -119,10 +119,27 @@ extension ServerInterfaceHandler:ChannelInboundHandler, RemovableChannelHandler
119119

120120
self.request = nil
121121

122-
if let operation:Server.Operation = .init(post: head.uri,
122+
let operation:Server.Operation?
123+
124+
switch head.method
125+
{
126+
case .POST:
127+
operation = .init(post: head.uri,
123128
address: self.address,
124129
headers: head.headers,
125130
body: body)
131+
132+
case .PUT:
133+
operation = .init(put: head.uri,
134+
address: self.address,
135+
headers: head.headers,
136+
body: body)
137+
138+
case _:
139+
fatalError("unreachable: collected buffers for method \(head.method)!")
140+
}
141+
142+
if let operation:Server.Operation
126143
{
127144
self.server.submit(operation, promise: self.accept(context: context))
128145
}

Sources/Media/MediaSubtype.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ enum MediaSubtype:String, Equatable, Hashable, Sendable
33
{
44
case apng
55
case avif
6+
case bson
67
case css
78
case gif
89
case html
@@ -75,6 +76,7 @@ extension MediaSubtype
7576
{
7677
case .apng: return "apng"
7778
case .avif: return "avif"
79+
case .bson: return "bson"
7880
case .css: return "css"
7981
case .gif: return "gif"
8082
case .html: return "html"

Sources/UnidocDB/Packages/UnidocDatabase.Graphs.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ extension UnidocDatabase.Graphs
6464
{
6565
switch try await self.upsert(some: graph, with: session)
6666
{
67-
case nil: return .insert
68-
case _?: return .update
67+
case nil: return .update
68+
case _?: return .insert
6969
}
7070
}
7171
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
extension Site.API
2+
{
3+
@frozen public
4+
enum Put:String
5+
{
6+
case symbolgraph
7+
}
8+
}
9+
extension Site.API.Put:StaticAPI
10+
{
11+
}

Sources/UnidocServer/InteractiveOperation.swift renamed to Sources/UnidocServer/InteractiveEndpoint.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import HTTP
22
import UnidocPages
33

4-
protocol InteractiveOperation:Sendable
4+
protocol InteractiveEndpoint:Sendable
55
{
66
var statisticalType:WritableKeyPath<ServerTour.Stats.ByType, Int> { get }
77

8-
func load(from server:Server.State,
9-
with cookies:Server.Request.Cookies) async throws -> ServerResponse?
8+
func load(from server:Server.InteractiveState,
9+
with cookies:Server.Cookies) async throws -> ServerResponse?
1010
}
11-
extension InteractiveOperation
11+
extension InteractiveEndpoint
1212
{
1313
var statisticalType:WritableKeyPath<ServerTour.Stats.ByType, Int>
1414
{

Sources/UnidocServer/Operations/AnyForm.swift

Lines changed: 0 additions & 7 deletions
This file was deleted.

Sources/UnidocServer/Operations/Server.Operation.Admin.swift renamed to Sources/UnidocServer/Operations/Server.Endpoint.Admin.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ import SymbolGraphs
77
import UnidocDB
88
import UnidocPages
99

10-
extension Server.Operation
10+
extension Server.Endpoint
1111
{
1212
enum Admin
1313
{
1414
case perform(Site.Admin.Action, MultipartForm?)
1515
case recode(Site.Admin.Recode)
1616
}
1717
}
18-
extension Server.Operation.Admin:RestrictedOperation
18+
extension Server.Endpoint.Admin:RestrictedEndpoint
1919
{
20-
func load(from server:Server.State) async throws -> ServerResponse?
20+
func load(from server:Server.InteractiveState) async throws -> ServerResponse?
2121
{
2222
let session:Mongo.Session = try await .init(from: server.db.sessions)
2323
let page:Site.Admin.Action.Complete

Sources/UnidocServer/Operations/Server.Operation.AdminDashboard.swift renamed to Sources/UnidocServer/Operations/Server.Endpoint.AdminDashboard.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import HTTP
22
import MongoDB
33
import UnidocPages
44

5-
extension Server.Operation
5+
extension Server.Endpoint
66
{
77
enum AdminDashboard
88
{
99
case status
1010
}
1111
}
12-
extension Server.Operation.AdminDashboard:RestrictedOperation
12+
extension Server.Endpoint.AdminDashboard:RestrictedEndpoint
1313
{
14-
func load(from server:Server.State) async throws -> ServerResponse?
14+
func load(from server:Server.InteractiveState) async throws -> ServerResponse?
1515
{
1616
let page:Site.Admin = .init(configuration: try await server.db.sessions.run(
1717
command: Mongo.ReplicaSetGetConfiguration.init(),
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
extension Server.Endpoint
2+
{
3+
struct AuthParameters
4+
{
5+
/// Only used for testing, never sent by GitHub.
6+
var token:String?
7+
/// Defined and sent by GitHub.
8+
var state:String?
9+
/// Defined and sent by GitHub.
10+
var code:String?
11+
12+
private
13+
init()
14+
{
15+
self.token = nil
16+
self.state = nil
17+
self.code = nil
18+
}
19+
}
20+
}
21+
extension Server.Endpoint.AuthParameters
22+
{
23+
init(_ parameters:[(key:String, value:String)]?)
24+
{
25+
self.init()
26+
27+
guard
28+
let parameters:[(key:String, value:String)]
29+
else
30+
{
31+
return
32+
}
33+
34+
for (key, value):(String, String) in parameters
35+
{
36+
switch key
37+
{
38+
case "token": self.token = value
39+
case "state": self.state = value
40+
case "code": self.code = value
41+
case _: continue
42+
}
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)