summaryrefslogtreecommitdiff
path: root/backend/api/src/server.zig
blob: 99f12d67f7867f4f4e89fd5967dc70438f00912e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
const z = @import( "std" );
const u = @import( "util.zig" );
const zap = @import( "zap" );
const api = @import( "api.zig" );
const user = @import( "user.zig" );
const chat = @import( "chat.zig" );
const prefs = @import( "userdata.zig" );
const model = @import( "model.zig" );
const stripe = @import( "stripe.zig" );
const config = @import( "config.zig" );
const userdata = @import( "userdata.zig" );

const Allocator = z.mem.Allocator;
const Status = zap.StatusCode;
const Request = zap.Request;

const bufprint = z.fmt.bufPrint;
var routes: z.StringHashMap( zap.HttpRequestFn ) = undefined;
const alloc = u.alloc;

fn index( r: Request ) void {
  r.sendBody( "" ) catch {};
}

fn stop( r: Request ) void {
  api.stop();
  z.time.sleep( 5000000000 );
  zap.stop();
  r.sendBody( "" ) catch {};
}

fn setupRoutes( a: Allocator ) void {
  routes = z.StringHashMap( zap.HttpRequestFn ).init( a );
  routes.put( "/", index ) catch {};
  //routes.put( "/stop", stop ) catch {};

  // user routes
  routes.put( "/login", user.routes.@"login" ) catch {};
  routes.put( "/get-tokens", user.routes.@"get-tokens" ) catch {};
  routes.put( "/create-token", user.routes.@"create-token" ) catch {};
  routes.put( "/delete-token", user.routes.@"delete-token" ) catch {};
  routes.put( "/delete-tokens", user.routes.@"delete-tokens" ) catch {};
  routes.put( "/send-login-link", user.routes.@"send-login-link" ) catch {};
  routes.put( "/invalidate-session", user.routes.@"invalidate-session" ) catch {};
  routes.put( "/invalidate-all-sessions", user.routes.@"invalidate-all-sessions" ) catch {};

  // settings routes
  routes.put( "/settings", prefs.routes.@"settings" ) catch {};
  routes.put( "/get-notes", prefs.routes.@"get-notes" ) catch {};
  routes.put( "/getalldata", prefs.routes.@"getalldata" ) catch {};
  routes.put( "/delete-note", prefs.routes.@"delete-note" ) catch {};
  routes.put( "/delete-notes", prefs.routes.@"delete-notes" ) catch {};
  routes.put( "/update-settings", prefs.routes.@"update-settings" ) catch {};

  // models route
  routes.put( "/models", model.routes.@"models" ) catch {};

  // stripe route
  routes.put( "/create-payment-intent", stripe.routes.@"create-payment-intent" ) catch {};

  // chat routes
  routes.put( "/chat", chat.routes.@"chat" ) catch {};
  routes.put( "/get-chat", chat.routes.@"get-chat" ) catch {};
  routes.put( "/generate", chat.routes.@"generate" ) catch {};
  routes.put( "/create-chat", chat.routes.@"create-chat" ) catch {};
  routes.put( "/delete-chat", chat.routes.@"delete-chat" ) catch {};
}

fn onRequest( r: Request ) void {
  r.setHeader( "Access-Control-Allow-Origin", "*" ) catch {};
  r.setHeader( "Access-Control-Allow-Methods", "*" ) catch {};
  r.setHeader( "Access-Control-Allow-Headers", "*" ) catch {};
  r.setHeader( "Access-Control-Allow-Credentials", "true" ) catch {};
  if( r.path ) |p| {
    if( routes.get( p ) ) |route| {
      route( r );
      return;
    }
  }

  r.setStatus( .not_found );
  r.sendBody( "<h1>404 Not Found</h1>" ) catch return;
}

var listener: zap.HttpListener = undefined;

pub fn listen( a: Allocator ) !void {
  setupRoutes( a );

  listener = zap.HttpListener.init( .{
    .port = config.server_port,
    .on_request = onRequest,
    .max_clients = 5000,
  } );

  try listener.listen();
}

pub fn deinit() void {
  routes.deinit();
}