diff --git a/.gitignore b/.gitignore index 2b3183a..7f1db4f 100644 --- a/.gitignore +++ b/.gitignore @@ -26,16 +26,10 @@ venv npm-debug.log* yarn-debug.log* yarn-error.log* -backend/migrations/versions/f539a7ad15a4_.py -backend/migrations/alembic.ini -backend/migrations/env.py -backend/migrations/script.py.mako -backend/migrations/versions/22cd0f8da398_.py +backend/migrations/ .gitignore -backend/migrations/versions/bb10324d2013_.py backend/.bashrc -backend/migrations/versions/f539a7ad15a4_.py backend/.vscode/settings.json .vscode/settings.json -backend/migrations/versions/f539a7ad15a4_.py .gitignore +backend/.flaskenv diff --git a/backend/.flaskenv b/backend/.flaskenv index 5453afd..3e45764 100644 --- a/backend/.flaskenv +++ b/backend/.flaskenv @@ -1,2 +1,4 @@ export FLASK_APP=autoapp.py export FLASK_DEBUG=1 +export DATABASE_URL="postgres://yhxpupao:qOmdC-HQGC8vX-K_T3T5HF9DWwAU1R5s@ruby.db.elephantsql.com:5432/yhxpupao" + diff --git a/backend/conduit/algolia.py b/backend/conduit/algolia.py new file mode 100644 index 0000000..df31f91 --- /dev/null +++ b/backend/conduit/algolia.py @@ -0,0 +1,13 @@ +from algoliasearch.search_client import SearchClient +import os +from dotenv import load_dotenv +from pathlib import Path # Python 3.6+ only + +env_path = Path('.') / '.env' +load_dotenv(dotenv_path=env_path) + +APPLICATION_ID = os.getenv('APPLICATION_ID') +ADMIN_API_KEY = os.getenv('ADMIN_API_KEY') + +client = SearchClient.create(APPLICATION_ID, ADMIN_API_KEY) +articleIndex = client.init_index('dev_articles') diff --git a/backend/conduit/articles/serializers.py b/backend/conduit/articles/serializers.py index 1fdaa87..a389138 100644 --- a/backend/conduit/articles/serializers.py +++ b/backend/conduit/articles/serializers.py @@ -23,7 +23,7 @@ class ArticleSchema(Schema): # for the envelope article = fields.Nested('self', exclude=('article',), default=True, load_only=True) tagList = fields.Nested(TagSchema, many=True) - favoritesCount = fields.Int(dump_only=True) + tagList = fields.List(fields.Str()) commentsCount = fields.Int(dump_only=True) favorited = fields.Bool(dump_only=True) isPublished = fields.Bool() diff --git a/backend/conduit/articles/views.py b/backend/conduit/articles/views.py index 95f8849..f78c514 100644 --- a/backend/conduit/articles/views.py +++ b/backend/conduit/articles/views.py @@ -12,9 +12,9 @@ from .models import Article, Tags, Comment from .serializers import (article_schema, articles_schema, article_form_schema, comment_schema, comments_schema) +from conduit.algolia import articleIndex from conduit.organizations.models import Organization - blueprint = Blueprint('articles', __name__) @@ -80,9 +80,12 @@ def make_article(body, title, description, isPublished, coverImage, tagList=None article.add_needReviewTag(mtag) article.add_tag(mtag) article.needsReview = True - else: # mtag.modSetting == 1: + else: # mtag.modSetting == 1: article.add_tag(mtag) article.save() + articleObject = article_schema.dump(article) + articleObject['objectID'] = article.id + articleIndex.save_object(articleObject) return article @@ -96,6 +99,9 @@ def update_article(slug, **kwargs): raise InvalidUsage.article_not_found() article.update(updatedAt=dt.datetime.utcnow(), **kwargs) article.save() + articleObject = article_schema.dump(article) + articleObject['objectID'] = article.id + articleIndex.save_object(articleObject) return article @@ -103,7 +109,9 @@ def update_article(slug, **kwargs): @jwt_required def delete_article(slug): article = Article.query.filter_by(slug=slug, author_id=current_user.profile.id).first() + article_id = article.id article.delete() + articleIndex.delete_object(str(article_id)) return '', 200 diff --git a/backend/conduit/extensions.py b/backend/conduit/extensions.py index ed45686..1c2a16d 100644 --- a/backend/conduit/extensions.py +++ b/backend/conduit/extensions.py @@ -8,7 +8,6 @@ from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy, Model - class CRUDMixin(Model): """Mixin that adds convenience methods for CRUD (create, read, update, delete) operations."""