El repositorio tiene la siguiente estructura de carpetas:
.
└── crosswords/
├── back/
│ ├── crosswords/
│ │ └── ...
│ └── src/
│ └── ...
├── docs
├── front
├── 0_palabras_todas.txt
├── compose.yml
├── dump-ndjson.py
├── README.md
├── spanish-words.txt
└── xwords.json
back
: API de la aplicación hecha con Express que utiliza MongoDB y Elasticsearchback/crosswords
: Contiene las plantillas de los crucigramas, las soluciones y las pistasfront
: Aplicación hecha en React para jugar al crucigramadocs
: Documentación del proyecto del crucigramadump-ndjson
: Script que convierte el archivo0_palabras_todas.txt
al formatondjson
xwords.json
: Documentos para importar en MongoDB
Para arrancar el proyecto tiene que instalar estos compoenetes:
Antes de iniciar el backend o el front ejecuta en la raiz del repositorio:
Linux y Windows
docker compose up -d
docker compose down -v # Para quitar los contenedores
Una vez iniciado los contenedores:
- Importa los crucigramas del archivo
xwords.json
a la instancia de MongoDB:
docker exec crossword-mongo-1 mongoimport --db=xword --collection=crosswords --file=/data/xwords.json
- Puebla
elasticsearch
con las palabras del diccionario del archivospanish-words.txt
(Tarda aproximadamente 1 minuto):
# En la raiz del repositorio
curl localhost:9200/_bulk/?pretty -X POST -H "Content-Type: application/x-ndjson" --data-binary @spanish-words.txt
Para ejecutar el servidor de Express tiene que ejecutar dentro de la carpeta back
lo siguiente:
cd back # Si ya está en la carpeta back no hace falta ejecutar este comando
npm install # Descarga las dependencias del proyecto
npm run build # Transpila el código typescript y lo convierte a javascript, crea una carpeta dist
node dist/index.js
Para ejecutar la aplicación de React con Node ejecuta:
Linux y Windows
cd front
npm install
npm run dev
docker ps -a # List all containers
docker start container
docker stop container
Formatear la respuesta json y que se vea bien.
curl localhost:9200/words/_search/?pretty
Buscar palabras con que cumplen el formato
curl -X GET "localhost:9200/words/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"wildcard": {
"word": {
"value": "?a?a"
}
}
},
"size": 20,
"from": 10
}
'
Poblar índice con documentos en ElasticSearch
curl -X POST http://localhost:9200/_bulk -H "Content-Type: application/json" -d'
{ "index" : { "_index" : "words" } }
{ "word": "sana" }
{ "index" : { "_index" : "words" } }
{ "word": "gana" }
{ "index" : { "_index" : "words" } }
{ "word": "zebra" }
{ "index" : { "_index" : "words" } }
{ "word": "mono" }
{ "index" : { "_index" : "words" } }
{ "word": "portatil" }
'