PalitasPR Svelte Themes

Palitaspr

PalitasPR – A platform for service providers and requesters in Puerto Rico. The project featured a frontend built with Svelte and Tailwind CSS, integrated with a Python Flask backend and PostgreSQL database. Originally deployed using AWS services (RDS, S3, EC2), the project is currently unhosted but remains available for review and reference.

PalitasPR

PalitasPR logo

Table of contents

Description

PalitasPR is a platform designed to simplify the connection between service providers and requesters in Puerto Rico. Finding and promoting services online can be challenging due to outdated platforms and the overwhelming noise on social media. Our platform streamlines this process by offering a fast, reliable, and user-friendly solution.

Project Overview

  • Frontend: Built with Svelte for a reactive, efficient user interface, styled using Tailwind CSS and DaisyUI, with Vite as the build tool.
  • Backend: Powered by Python Flask, handling requests and server-side logic.
  • Database: Structured with PostgreSQL for robust and scalable data management.
  • Cloud Services: Originally deployed using AWS (RDS, S3, EC2) for hosting and scalability.

Note

This project is no longer hosted but remains accessible on GitHub for review and reference.

Usage

Frontend

Svelte installation using Vite

npm create vite@latest <project-name>

TailwindCSS Installation

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

TailwindCSS Config

/** @type {import('tailwindcss').Config} */
export default {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
Global CSS Tailwind imports
@tailwind base;
@tailwind components;
@tailwind utilities;

DaisyUI Installation

npm i -D daisyui@latest

DaisyUI Config

module.exports = {
  //...
  plugins: [
    require('daisyui'),
  ],
}

Running the project

npm run dev # runs the project in development mode

Backend

Main App

The Main App is the core of our platform, utilizing the Flask framework for a seamless connection between the frontend and backend. It features a modular blueprint structure for organized routing and API management. With SQLAlchemy and PostgreSQL, we handle data efficiently, supporting C.R.U.D. operations and custom queries. The application serves static files, including Svelte-generated JavaScript and CSS, ensuring a dynamic user interface. AWS S3 integration allows secure image uploads and retrievals. Key components include app.py for app initialization, base_model.py and models.py for database schema, console.py for command-line database operations, and emails.py for managing email communications. This setup ensures a robust and scalable backend infrastructure.

SQLAlchemy and Postgres

Our application relies on SQLAlchemy, an ORM (Object-Relational Mapping) tool, to interact with our PostgreSQL database efficiently. SQLAlchemy simplifies database operations by mapping Python objects to database tables and handling queries through Python methods.

While SQLAlchemy encourages using relationships defined in models for data retrieval, we occasionally opt for custom SQL queries executed directly from the database session. This approach allows us to optimize performance for specific queries that may be more efficient when tailored directly to our database schema and requirements.

Database Operations are managed through the db folder, organized based on class models and standard CRUD operations. We use SQLAlchemy as our ORM tool to map Python objects to PostgreSQL tables. While ORM relationships are used for typical data retrieval, custom SQL queries are employed for performance optimization in specific scenarios.

DB Operations Classes The following classes manage various aspects of database interactions:

  • DBOperations: General database operations.
  • Db_promotion: Operations related to promotions.
  • Db_user: User-related operations, including login and signup.
  • Db_core: Core operations like search and filtering.
  • Db_task: Task management operations.
  • Db_review: Review management operations.
  • Db_promo_towns: Promotion town mappings.
  • Db_request_towns: Request town mappings.
  • Db_initial_contact: Initial contact operations.
  • Db_request: Request management operations.

These classes encapsulate the logic for interacting with the database, ensuring a clean separation of concerns and making the codebase easier to maintain and extend.

This hybrid approach ensures flexibility in managing our database interactions, balancing the convenience of ORM with the performance benefits of custom SQL queries where necessary.

S3 Bucket With the App

Our application seamlessly integrates with AWS S3 for managing pictures. When uploading or retrieving pictures, we leverage Boto3, the AWS SDK for Python, to interact with our S3 bucket. For uploads, the app sends requests to S3, storing pictures securely in the cloud. When retrieving pictures, we generate presigned URLs using Boto3, granting temporary access to specific objects in our S3 bucket. These presigned URLs are then provided to the frontend, enabling clients to fetch and display pictures dynamically. This approach ensures efficient storage, retrieval, and display of images while maintaining security and scalability.

Backend Files Structure

Folders & Files Content
api_blueprints Routes and blueprints for main flask app.py
api_documentation Routes documentation
db Db operation files based on class model and regular C.R.U.D for database
email_template Template for email visual structure sent on confimation email
static Files to serve from the frontend build via flask
app.py Main Flask Aplication
aws_bucket.py S3 bucket related functions
base_model.py Base model for all models
models.py All models represeting tables on database
console.py Testing console for the app
emails.py Functions related to emails

Cloud

Deployment

How is it Deployed?

Our deployment strategy revolves around leveraging AWS services for robust and scalable hosting. We've secured our domain, palitaspr.com, using Amazon Route 53 and obtained an SSL/TLS certificate from AWS Certificate Manager (ACM). This certificate ensures secure communication over HTTPS.

The core of our infrastructure is managed by an Elastic Load Balancer (ELB), which distributes incoming traffic across multiple EC2 instances, but in the case of this demo project only to one. These instances are configured with a Linux server environment running Gunicorn and Nginx. Gunicorn serves as the WSGI server, handling Python web application requests the main app.py, while Nginx acts as a reverse proxy server, enhancing performance by caching and serving static content.

Our ELB is configured to target a group of EC2 instances, where listeners on ports 80 (HTTP) and 443 (HTTPS) are redirected to our palitaspr.com EC2 instance.

Cloud Files Structure

AWS Instance Usage
RDS Hosting Postgres Database
EC2 Virtual machine using linux with gunicorn and nginx to run server
ELB Load balancer to redirect traffic from http and https into EC2 intance
S3 Bucket for handling pictures of the app and its users
Route-53 Used to obtain domain 'palitaspr.com'
ACM Certification(SSL) from ACM to use https safely in our load balancer'

Screenshots

Service details

Profile page

Learn more about the project


Take a look at our landing page and learn more about PalitasPR!


Credits

Members Roles Links
Antonio de Jesus Database Manager
Jonathan Perez Frontend-Mobile Developer
Livan Hernandez Frontend Developer
Louis Toro Backend Developer
Luis Santiago Lead Developer


Back to top ↑

Top categories

Loading Svelte Themes