diff --git a/.env.example b/.env.example index cf01e616..2661f007 100644 --- a/.env.example +++ b/.env.example @@ -2,3 +2,4 @@ SECRET_KEY_BASE= IMAP_SERVER= DEFAULT_FROM= DEVISE_PEPPER= +SKEL_SUTTY=https://0xacab.org/sutty/skel.sutty.nl diff --git a/Gemfile b/Gemfile index f9edac69..dbf7ad1a 100644 --- a/Gemfile +++ b/Gemfile @@ -53,6 +53,8 @@ gem 'mini_magick' gem 'pundit' gem 'rails-i18n' gem 'rails_warden' +gem 'rugged' +gem 'validates_hostname' gem 'whenever', require: false group :development, :test do @@ -82,3 +84,8 @@ group :development do gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end + +group :test do + gem 'database_cleaner' + gem 'factory_bot_rails' +end diff --git a/Gemfile.lock b/Gemfile.lock index 5be9949d..f9da67dd 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -98,6 +98,7 @@ GEM ruby-enum (~> 0.5) concurrent-ruby (1.1.5) crass (1.0.4) + database_cleaner (1.7.0) devise (4.6.2) bcrypt (~> 3.0) orm_adapter (~> 0.1) @@ -127,6 +128,11 @@ GEM actionmailer (>= 4.0, < 6) activesupport (>= 4.0, < 6) execjs (2.7.0) + factory_bot (5.0.2) + activesupport (>= 4.2.0) + factory_bot_rails (5.0.2) + factory_bot (~> 5.0.2) + railties (>= 4.2.0) fastimage (2.1.5) ffi (1.11.1) font-awesome-rails (4.7.0.4) @@ -286,6 +292,7 @@ GEM ruby_parser (3.13.1) sexp_processor (~> 4.9) rubyzip (1.2.2) + rugged (0.28.2) safe_yaml (1.0.5) sass (3.7.4) sass-listen (~> 4.0.0) @@ -344,6 +351,9 @@ GEM unf_ext unf_ext (0.0.7.5) unicode-display_width (1.5.0) + validates_hostname (1.0.8) + activerecord (>= 3.0) + activesupport (>= 3.0) warden (1.2.8) rack (>= 2.0.6) web-console (3.7.0) @@ -376,6 +386,7 @@ DEPENDENCIES carrierwave-bombshelter carrierwave-i18n commonmarker + database_cleaner devise devise-i18n devise_invitable @@ -383,6 +394,7 @@ DEPENDENCIES ed25519 email_address exception_notification + factory_bot_rails font-awesome-rails friendly_id haml-rails @@ -400,6 +412,7 @@ DEPENDENCIES rails_warden rbnacl (< 5.0) rubocop + rugged sass-rails (~> 5.0) selenium-webdriver spring @@ -407,6 +420,7 @@ DEPENDENCIES sqlite3 (~> 1.3.6) turbolinks (~> 5) uglifier (>= 1.3.0) + validates_hostname web-console (>= 3.3.0) whenever diff --git a/app/models/site.rb b/app/models/site.rb index bb85d2af..a7d68699 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -5,6 +5,8 @@ class Site < ApplicationRecord include FriendlyId + validates :name, uniqueness: true, hostname: true + friendly_id :name, use: %i[finders] has_many :roles diff --git a/db/migrate/20190711183726_add_unique_to_site_name.rb b/db/migrate/20190711183726_add_unique_to_site_name.rb new file mode 100644 index 00000000..8fd5a9f0 --- /dev/null +++ b/db/migrate/20190711183726_add_unique_to_site_name.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +# Los nombres de los sitios son únicos +class AddUniqueToSiteName < ActiveRecord::Migration[5.2] + def change + remove_index :sites, :name + add_index :sites, :name, unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 6e3c298f..c01df6a3 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -12,7 +12,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20_190_706_002_615) do +ActiveRecord::Schema.define(version: 20_190_711_183_726) do create_table 'roles', force: :cascade do |t| t.datetime 'created_at', null: false t.datetime 'updated_at', null: false @@ -29,7 +29,7 @@ ActiveRecord::Schema.define(version: 20_190_706_002_615) do t.datetime 'created_at', null: false t.datetime 'updated_at', null: false t.string 'name' - t.index ['name'], name: 'index_sites_on_name' + t.index ['name'], name: 'index_sites_on_name', unique: true end create_table 'usuaries', force: :cascade do |t| diff --git a/doc/crear_sitios.md b/doc/crear_sitios.md new file mode 100644 index 00000000..f953d88f --- /dev/null +++ b/doc/crear_sitios.md @@ -0,0 +1,107 @@ +# Crear sitios + +Para que les usuaries puedan crear sitios, vamos a tener el siguiente +flujo: + +* Nombre del sitio, en minúsculas, sin puntos. + +* Descripción, una descripción de qué hace el sitio para Sutty y otres + usuaries del sitio. + +* Plantilla. Lista de plantillas disponibles, con captura, nombre, link + a vista previa, link a autore, licencia y usos posibles (blogs, medios + alternativos, denuncias, etc.) + + Tengo mi propio diseño! Explicar que vamos a dar esta posibilidad más + adelante, pero que necesitamos financiamiento. Esto permitiría + agregar un repositorio o gema de plantilla. + +* Licencia. Elegir la licencia del contenido de un listado con + licencias piolas: + + * PPL + * CC-BY + * CC-BY-SA + * CC-0 + +* Lugares donde se van a subir los sitios. Por defecto nombre.sutty.nl, + otras opciones en un desplegable: + + * Tengo mi propio dominio: Explica que todavía no tenemos esto + autogestionado pero que si quieren apoyar el trabajo que hacemos + pueden donarnos o ponerse en contacto. + + Más adelante pide los dominios, explica cómo comprarlos en njal.la y + qué información poner los DNS para poder alojarlos. Cuando Sutty + tenga su propio DNS, indica los NS. + + * Neocities: Explicar qué es neocities y permitir agregar una cuenta. + Podríamos varias pero queremos estar bien con neocities y además no + tiene mucho sentido tener varias páginas en el mismo host. + + Pedir usuarie y contraseña o API key. Dar link directo a dónde + sacar la API key y explicar para qué es. + + **En realidad esta sería nuestra primera opción?** + + * Zip: Descargar el sitio en un archivo zip, proponiendo posibles usos + offline (raspberries, etc!) + + Da una URL desde donde se puede descargar el sitio. + + * SSH/SFTP: Explicar que permite enviar el sitio a servidores propios. + Permite agregar varios servidores, pide usuario, dominio y puerto. + Da la llave pública SSH de Sutty y explica cómo agregarla al + servidor remoto. También da un link de descarga para que puedan + hacer ssh-copy-id. + + **Esto todavía no** + + * IPFS: Da la opción de activar/desactivar soporte para IPFS. + Explica qué es y para qué sirve. Vincula a documentación sobre + instalar IPFS de escritorio y cómo pinear el hash de sutty, instalar + el companion, etc. + + **Esto todavía no** + + * Torrent: Genera un torrent y lo siembra. + + **Esto todavía no** + + * Syncthing: Explica qué es y da la ID del nodo introductor de Sutty. + + **Esto todavía no** + + * Zeronet: Idem syncthing? + + **Esto todavía no** + + * Archive.org + + **Esto todavía no** + +* Crear sitio! + +## Sitios + +Tenemos un sitio esqueleto que tiene lo básico para salir andando: + +* Gemas de Jekyll +* Gemas de Sutty +* Gemas de Temas +* Esqueleto de la configuración +* Directorios base (con i18n también) + +El sitio esqueleto es un repositorio Git que se clona al directorio del +sitio. Esto permite luego pullear actualizaciones desde el esqueleto a +los sitios, esperamos que sin conflictos! + +## Plantillas + +Las plantillas son plantillas Jekyll adaptadas a Sutty. Vamos a empezar +adaptando las que estén disponibles en y +otras fuentes, agregando features de Sutty y simplificando donde haga +falta (algunas plantillas tienen requisitos extraños). + +Las plantillas se instalan como gemas en los sitios, de forma que +podemos cambiarla desde las opciones del sitio luego. diff --git a/test/factories/rol.rb b/test/factories/rol.rb new file mode 100644 index 00000000..103f12a3 --- /dev/null +++ b/test/factories/rol.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :rol do + usuarie + site + rol { 'usuarie' } + temporal { false } + + factory :rol_invitade do + rol { 'invitade' } + end + end +end diff --git a/test/factories/site.rb b/test/factories/site.rb new file mode 100644 index 00000000..7947e8af --- /dev/null +++ b/test/factories/site.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :site do + name { SecureRandom.hex } + end +end diff --git a/test/factories/usuarie.rb b/test/factories/usuarie.rb new file mode 100644 index 00000000..18a4042e --- /dev/null +++ b/test/factories/usuarie.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :usuarie do + email { SecureRandom.hex + '@sutty.nl' } + password { SecureRandom.hex } + confirmed_at { Date.today } + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 8a5709ef..49ac63e7 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,8 +4,12 @@ require File.expand_path('../config/environment', __dir__) require 'rails/test_help' require 'open3' +# rubocop:disable Style/ClassAndModuleChildren class ActiveSupport::TestCase + include FactoryBot::Syntax::Methods # Resetear el repositorio a su estado original antes de leerlo + # + # TODO mover a Site.reset! cuando empecemos a trabajar con git def reset_git_repo(path) Dir.chdir(path) do Open3.popen3('git reset --hard') do |_, _, _, thread| @@ -15,3 +19,4 @@ class ActiveSupport::TestCase end end end +# rubocop:enable Style/ClassAndModuleChildren