# Project: pollinator
## Overview
### Purpose
The purpose of pollinator is two-fold:
* To build an open and safe alternative of many popular SaaS offerings in the poll, survey, questionaiire space of web applications.
* To build a complete web application as a team, backend, frontend and automated CI/CD with an end date of production live by end of day.
### Prerequisites
What you will need:
* A personal computer (_ideally_) to hack on.
* An account on [git.mills.io](https://git.mills.io)
## Requirements
### Stories
* As "creator" I want to be able to create a new open poll with a title and optional description and a type of either "Open Questions" or "Open Vote".
* As a "creator" once a new "open poll" is created I should be redirected to the newly created poll of the given title, description and type with a shareable cryptographically secure link that is hard to guess but easy to share.
* As a "participant" opening a link to a "poll" that was shared with me, I should see the title, optional description and depending on the type be presented with:
* If the type is "Open Questions"; a list of the questions already posted by other "participants" as well as a way to vote for those questions. In addition there should be a way to post a new question or edit existing ones for corrections.
* If the type "Open Vote" the open singular question or statement is displayed with a way to either vote for or against.
* As either a "creator" or "particpant" an open poll can be exported and display in a meaningful way.
### Design
For the purposes of this exercise, since this is a learning exercise and an opportunity to have fun and deliver a production ready piece of software to the wild the terms `MAY`, `MUST`, `MUST NOT`are used to guide the project:
* The backend `MUST` be written in Go as an exercise in learning Go.
* The backend `MAY` use any libraries available in the Go standard library or 3rd-parties.
* The backend `MUST NOT` use any frameworks (_as these have steeper's learning curves and often incur unnecessary cost_)
* The frontend `MUST` be written in MithrilJS as an exercise in learning MithrilJS (_for the rest of us)
* The frontend `MAY` use any artwork, css and layout.
* The frontend `MUST NOT` use any frameworks for the same reasons as the backend.
* The resulting final compiled binary `MUST` be self-contained and portable including all backend and frontend functionality and all assets.
> **Note**: The infrastructure will already have been setup on effectively a PasS (_Platform as a Service_) with a TLS-enabeld sub-domain ready to go with a CI/CD pipeline that will deploy changes live as they are pushed to Git.
### Tech Stack
Backend:
* Go
Frontend:
* MithrilJS
Infrastructure:
* Docker Swarm for Service and Container orchestration
* Treafikv2 Ingress for load balancing and TLS termination
* Gitea for Git code hosting
* Drone for CI/CD
* Registryv2 for Docker image hosting
* Proxmox VE as the underlying Virtual Infrastructure