CoupleCare Server

Backend API con Vapor

Este repositorio alberga un proyecto de servidor backend desarrollado en el lenguaje Swift utilizando la librería Vapor. Su propósito principal es ofrecer una API RESTful con endpoints específicos que interactúan con una base de datos para proporcionar datos a una aplicación móvil.

Características Principales

Lenguaje y Framework: El proyecto está escrito en Swift, aprovechando las capacidades de la librería Vapor para la implementación del servidor. Base de Datos: Utiliza SQLite como sistema de gestión de bases de datos, con esquemas definidos mediante migraciones de modelos en Vapor. Endpoints RESTful: Proporciona endpoints del tipo GET para obtener elementos desde la base de datos y endpoints del tipo POST para recibir sugerencias de nuevos elementos por parte de los usuarios.

Estructura del Proyecto

El proyecto se organiza en torno a las siguientes funcionalidades principales:

Migraciones de Base de Datos: Define y gestiona la estructura de la base de datos mediante migraciones de modelos en Vapor para garantizar la integridad y consistencia de los datos. Endpoints de API: Implementa endpoints específicos que permiten la interacción entre la aplicación móvil y el backend, incluyendo operaciones para obtener datos existentes y recibir sugerencias de nuevos elementos.

Ambientes de Desarrollo

Este proyecto cuenta con dos ambientes de bases de datos: uno destinado para pruebas (testing) y otro para producción (production). Estos ambientes ofrecen la posibilidad de validar y realizar pruebas en un entorno controlado antes de desplegar cambios en la versión de producción.

Resources

La API contiene listados sobre sugerencias de actividades que realizar en pareja, clasificadas por categorías y tags. Los dailies son sugerencias de acciones unipersonales de detalles que tener con tu pareja. El endpoint POST permite recibir sugerencias. Se pueden obtener las ultimas activiades y dailies a partir de un índice dado.

GET http://127.0.0.1:8080/testing/currentversion GET http://127.0.0.1:8080/testing/categories GET http://127.0.0.1:8080/testing/tags GET http://127.0.0.1:8080/testing/activities GET http://127.0.0.1:8080/testing/dailies

LATEST GET http://127.0.0.1:8080/testing/latest/categories/{index} GET http://127.0.0.1:8080/testing/latest/tags/{index} GET http://127.0.0.1:8080/testing/latest/quotes/{index} GET http://127.0.0.1:8080/testing/latest/activitiesdetail/{index}

RANDOM GET http://127.0.0.1:8080/testing/random/daily

SUGGESTIONS POST http://127.0.0.1:8080/testing/suggested

Apuntes

Creación de tablas

import Fluent
import Vapor

final class Activity: Model, Content {
    static let schema:String = activity
    
    @ID(custom: .id) var id: Int?
    @Field(key:"hint") var hint: String
    @Field(key: "instructions") var instructions: String
    @Field(key: "maxReward") var maxReward: Int
    @Field(key: "price") var price: Int
    @Parent(key: "categoryId") var categoryId: Category
    @Siblings(through: ActivityTag.self, from:  \.$activity, to: \.$tag) public var tags: [Tag]
    
    
    init() { }
    
    init(id: Int? = nil, hint: String, instructions: String, maxReward: Int = 3, price: Int = 5, categoryId: Int) {
        self.id = id
        self.hint = hint
        self.instructions = instructions
        self.maxReward = maxReward
        self.price = price
        self.$categoryId.id = categoryId
    }
}

Endpoints

struct CCQueryDB  {
    let dbName: DatabaseID
    let apiGroup: String
    
    func boot(api: String, routes:RoutesBuilder) throws {
        
            let api = routes.grouped("\(apiGroup)")
            
            api.get("currentversion",use: currentVersion)
            api.get("categories", use: getCategories)
            api.get("tags",use: getTags)
            api.get("quotes", use: getQuotes)
            
            api.get("activities", use: getActivities)
            api.get("activitiesdetail", use: getActivitiesDetail)
            api.get("activitytags", use: getActivityTags)
            api.get("dailies", use: getDailies)
            api.get("dailiesdetail", use: getDailiesDetail)
            api.get("dailytags", use: getDailyTags)

¿Quieres recibir posts, cheatCodes, enlaces y katas en Swift para practicar?

Quincenalmente recibirás en tu correo electrónico la newsletter, solo hace falta tu correo electrónico.