Skip to content

Instantly share code, notes, and snippets.

@bennibau
Last active August 30, 2018 08:31
Show Gist options
  • Save bennibau/5f688597f69c3c427bc69eea1163e9a1 to your computer and use it in GitHub Desktop.
Save bennibau/5f688597f69c3c427bc69eea1163e9a1 to your computer and use it in GitHub Desktop.
//
// RESTController.swift
// App
//
// Created by Benjamin Baumann on 06.07.18.
//
import Foundation
import Vapor
import Authentication
import Crypto
import FluentSQLite
struct UserMessageRequest: Content {
let senderId: UUID
}
struct UserDto: Content {
let id: UUID?
let name: String
}
class RESTController: RouteCollection {
func boot(router: Router) throws {
let group = router.grouped("api", "protected")
let guardAuthMiddleware = User.guardAuthMiddleware()
let tokenAuthMiddleware = User.tokenAuthMiddleware()
let tokenAuthGroup = group.grouped([tokenAuthMiddleware, guardAuthMiddleware])
tokenAuthGroup.get("getMyMessages", use: getMessagesByUserHandler)
tokenAuthGroup.get("usersList", use: getAllUsersHandler)
}
}
//MARK: Helper
private extension RESTController {
/// GET returns a list of all users exept for the currently logged in user
///
/// - Parameter request: Request
/// - Returns: A list of users
func getAllUsersHandler(_ request: Request) throws -> EventLoopFuture<[UserDto]> {
//get all users except me
let allUsers = try User.query(on: request).filter(\.id != request.getUser().id).all()
let mappedUsers = allUsers.map { users -> [UserDto] in
var userContainer = [UserDto]()
users.forEach({ user in
userContainer.append(UserDto(id: user.id, name: user.email))
})
return userContainer
}
return mappedUsers
}
/// GET Returns all messages between the logged in user and a given user provided in the request
///
/// - Parameter request: the request,
/// - Query: senderId, The UUID of the sender of the messages
/// - Returns: array of messages
func getMessagesByUserHandler(_ request: Request) throws -> EventLoopFuture<[Message]> {
let userMessageRequest = try request.query.decode(UserMessageRequest.self)
let user = try request.requireAuthenticated(User.self)
let messagesFromUser = try user.messagesReceived.query(on: request).filter(\Message.senderId == userMessageRequest.senderId).all()
return messagesFromUser
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment