APIRouteCollection

protocol APIRouteCollection

Auth Groups

  • addFlexAuthGroup(to:) Extension method

    Adds Flexible Auth to a route. This route can be accessed without a token (while not logged in), but req.auth.get(User.self) will still return a user if one is logged in. Route handlers for these routes should not call req.auth.require(User.self). A route with no auth middleware will not auth any user and .get(User.self) will always return nil. The Basic and Token auth groups will throw an error if no user gets authenticated (specifically:User.guardMiddleware throws).

    So, use this auth group for routes that can be accessed while not logged in, but which provide more (or different) data when a logged-in user accesses the route.

    Declaration

    Swift

    func addFlexAuthGroup(to: RoutesBuilder) -> RoutesBuilder
  • addFlexCacheAuthGroup(to:) Extension method

    I’m moving auth over to UserCache, so that you’ll auth a UserCacheData struct instead of a User model. Functionally, this means a UserCacheData gets added to req.auth instead of a User. And, we avoid a SQL call per API call.

    Declaration

    Swift

    func addFlexCacheAuthGroup(to: RoutesBuilder) -> RoutesBuilder
  • addBasicAuthGroup(to:) Extension method

    For routes that require HTTP Basic Auth. Tokens won’t work. Generally, this is only for the login route.

    Declaration

    Swift

    func addBasicAuthGroup(to: RoutesBuilder) -> RoutesBuilder
  • addTokenCacheAuthGroup(to:) Extension method

    For routes that require a logged-in user. Applying this auth group to a route will make requests that don’t have a valid token fail with a HTTP 401 error.

    Declaration

    Swift

    func addTokenCacheAuthGroup(to: RoutesBuilder) -> RoutesBuilder

Guards

Notification Management

  • addNotifications(users:type:info:on:) Extension method, asynchronous

    Declaration

    Swift

    func addNotifications(users: [UUID], type: NotificationType, info: String, on req: Request) async throws
  • Declaration

    Swift

    func handleUnreadMessage(
    	req: Request,
    	msgID: UUID,
    	inbox: Request.Redis.MailInbox,
    	users: [UUID],
    	group: inout ThrowingTaskGroup<Void, Error>
    ) -> [UUID]
  • Declaration

    Swift

    func subtractNotifications(users: [UUID], type: NotificationType, subtractCount: Int = 1, on req: Request)
    	async throws
  • deleteFezNotifications(userIDs:fez:on:) Extension method, asynchronous

    Declaration

    Swift

    func deleteFezNotifications(userIDs: [UUID], fez: FriendlyFez, on req: Request) async throws
  • markNotificationViewed(user:type:on:) Extension method, asynchronous

    Declaration

    Swift

    func markNotificationViewed(user: UserCacheData, type: NotificationType, on req: Request) async throws
  • storeNextFollowedEvent(userID:on:) Extension method, asynchronous

    Declaration

    Swift

    func storeNextFollowedEvent(userID: UUID, on req: Request) async throws -> (Date, UUID)?
  • storeNextJoinedLFG(userID:on:) Extension method, asynchronous

    Declaration

    Swift

    func storeNextJoinedLFG(userID: UUID, on req: Request) async throws -> (Date, UUID)?
  • Returns the file system path for the given image filename. Makes sure all image directories in the path exist.

    Currently, this fn returns paths in the form: /images///.jpg where “xx” is the first 2 characters of the filename.

    Declaration

    Swift

    func getImagePath(for image: String, format: String? = nil, usage: ImageUsage, size: ImageSizeGroup, on req: Request) throws -> URL
  • processImages(_:usage:on:) Extension method, asynchronous

    Takes an an array of ImageUploadData as input. Some of the input elements may be new image Data that needs procssing; some of the input elements may refer to already-processed images in our image store. Once all the ImageUploadData elements are processed, returns a [String] containing the filenames where al the images are stored. The use case here is for editing existing content with image attachments in a way that prevents re-uploading of photos that are already on the server.

    • req: The incoming Request, on which this processing must run.

    Declaration

    Swift

    func processImages(_ images: [ImageUploadData], usage: ImageUsage, on req: Request) async throws -> [String]

    Parameters

    images

    The images in ImageUploadData format.

    usage

    The type of model using the image content.

    Return Value

    The generated names of the stored files.

  • processImage(data:usage:on:) Extension method, asynchronous

    Takes an optional image in Data form as input, produces full and thumbnail JPEG vrsions, places both the thumbnail and full image in their respective directories, and returns the generated name of the file on success, an empty string otherwise.

    • req: The incoming Request, on which this processing must run.

    Declaration

    Swift

    func processImage(data: Data?, usage: ImageUsage, on req: Request) async throws -> String?

    Parameters

    data

    The uploaded image in Data format.

    usage

    The type of model using the image content.

    Return Value

    The generated name of the stored file, or nil.

  • archiveImage(_:on:) Extension method

    Archives an image that is no longer needed other than for accountability tracking, by removing the full-sized image and moving the thumbnail into the archive/ subdirectory of the provided base image directory.

    This is a synchronous operation, until such time as we can use SwiftNIO 2’s asynchronous file I/O.

    Declaration

    Swift

    func archiveImage(_ image: String, on req: Request)

    Parameters

    image

    The filename of the image.

    imageDir

    The base image directory path for the image’s context.