Development/Summer of Code/2019/BookBrainz: Difference between revisions

From MusicBrainz Wiki
Jump to navigationJump to search
 
(6 intermediate revisions by the same user not shown)
Line 14: Line 14:
Proposed Mentors: ''Monkey''<br>
Proposed Mentors: ''Monkey''<br>
Languages/skills: Node.js, PostgreSQL, Docker
Languages/skills: Node.js, PostgreSQL, Docker

[https://community.metabrainz.org/c/bookbrainz Forum for discussion]
[https://community.metabrainz.org/c/bookbrainz Forum for discussion]


Line 24: Line 25:
We do not want to impose a specific framework, but the url structure will aim to be harmonized with other MetaBrainz projects.
We do not want to impose a specific framework, but the url structure will aim to be harmonized with other MetaBrainz projects.


You will also write the accompanying tests, as well as a documentation that will be available for users.
You will be expected to use test driven development, as well as prepare a documentation that will be available for the public.

You will also participate in preparing the Docker image used to run the API in production, and how to integrate it into MetaBrainz’ hosting architecture.

=== Use Solr search engine ===

Proposed Mentors: ''Monkey''<br>
Languages/skills: Node.js, Solr, (PostgreSQL, Docker)

[https://community.metabrainz.org/c/bookbrainz Forum for discussion]


BookBrainz currently uses ElasticSearch for its search engine, and we are aiming to replace it in favor of [https://lucene.apache.org/solr/guide/7_5/getting-started.html Solr].


This will simplify hosting BookBrainz on the same infrastructure as the other MetaBrainz projects and harmonize the technologies we use. ElasticSearch is also quite resource intensive and creating some issues for developers on slower computers.

A good understanding of NodeJS and ExpressJS is required to find and replace the relevant components in the web server.

You will set up Solr for use with Bookbrainz' schema, drawing inspiration from existing MusicBrainz code.

On the Node side, you will aim to reproduce the current search functionalities (have a look [https://github.com/bookbrainz/bookbrainz-site/blob/56c54a07ad9368c8ae79a803943e32dda4650429/src/server/routes/search.js here] ), including updating the Solr index on creation/modification of entities (as described [https://lucene.apache.org/solr/guide/6_6/uploading-data-with-index-handlers.html#UploadingDatawithIndexHandlers-JSONFormattedIndexUpdates in the docs] . Currently this is done [https://github.com/bookbrainz/bookbrainz-site/blob/c2f9bd31293290b1dc83f7d8e1eb10e70a836d58/src/server/helpers/search.js#L185 like this] for ES). In addition, we would like to add pagination to the search page, which should be fairly simple to achieve with Solr.

Communicating with Solr can be done simply [https://lucene.apache.org/solr/guide/6_6/using-javascript.html via HTTP requests]. If needed, it could otherwise be done using a JS library if deemed suitable.

You will also be involved in the preparation of the production deployment, adapting existing Docker configurations from MusicBrainz.

=== Design and implement a unified creation form ===

Proposed Mentors: ''Monkey''<br>
Languages/skills: User interfaces, User Experience, React, Node.js

[https://community.metabrainz.org/c/bookbrainz Forum for discussion]

If you are familiar with BookBrainz, you will know that each entity has a separate creation form. You can see these in the website's menu bar under "+ Add".

This leads to a complex workflow for simple use cases (such as 'adding a book') and repeating data (for example the title of a work repeated for an edition and an edition group, in a simple use case of a book), increasing chances of making errors.
Such an evident workflow should be straightforward (especially for inexperienced users), and we ask you to design and implement a single form that will improve the editing experience.

Tabs will likely be necessary to separate the different entities forms as steps.
For each step, entities can be searched for or created, with the full range of options the current forms do.
The form will automatically link together the various entities accordingly.

Keep in mind that "adding a book" is a simple case, and that we should be able to optionally enter more complicated cases (for example an anthology of short stories will have multiple Works, and the title of the Edition may be different from any of the Works it contains).

The first phase should be to make a mockup with a prototyping/wireframing tool such as Sketch, Figma or Pencil Project. You will be expected to develop the components using MetaBrainz' new React-storybook [https://github.com/metabrainz/design-system design system].
We will work together iteratively during both the UX and development sections of the project.

=== User collections ===

Proposed Mentors: ''Monkey''<br>
Languages/skills: React, Node.js, User Experience, SQL

[https://community.metabrainz.org/c/bookbrainz Forum for discussion]

With all this data available, it would be great if BookBrainz users could use the website to save the books they have read, mark the ones they would like to read, mark gifts ideas, etc.

Using test-driven development, you will develop a user collection feature that will allow users to create, organize and retrieve collections.

A collection can only contain one type of entity (Author, Work, Edition Group, etc.).
A user can create an arbitrary number of collections with an arbitrary number of items in it.
A collection can be set to private or public, and can have an optional description.


On the front-end, there should be a new page (`/user/{USERNAME}/collections`) to view another user's public collections, or view and manage (edit name, set private/public and description, delete) all one's own collections.

Each collection has its own page for display purposes, where a user can remove and add items, and change the collection's settings.


There should also be easily accessible ways of adding entities to your collections, at the very least in the entity display pages, but also possibly in the search page, homepage, etc. You will suggest appropriate places for such buttons.

Clicking on an "add to collection" button will require to show a component to choose which collection to add to (filtered by type corresponding to the entity to add), or to create a new collection on the fly.


Using a prototyping/wireframing tool will help for the design and user experience iterations.
You will learn to use MetaBrainz' new React-based [https://github.com/metabrainz/design-system design system]



This feature could also help us build a recommendation engine in the future, along with data from CritiqueBrainz.
You will also learn to prepare the Docker image we will use to run the API in production, and how to integrate it to MetaBrainz’s hosting architecture.

Latest revision as of 11:51, 20 March 2019

This page will discuss the current list of suggested ideas for students to develop proposals for for Google's Summer of Code. If you're a student, feel free to base your proposal on one of these ideas, or pick and entirely new idea that you think might be useful to us.

Getting Started

(see also: Getting started with GSoC)

The first thing to do to get started with BookBrainz is to clone the bookbrainz-site GitHub repository, and follow the README.md file to get the site up and running.

Come and speak to us in the MetaBrainz IRC (freenode/#metabrainz) if you finish all of that, or get stuck at any point!

Ideas

Web API

Proposed Mentors: Monkey
Languages/skills: Node.js, PostgreSQL, Docker

Forum for discussion


BookBrainz currently does not have a way to programmatically query the database.

For this project, you will design a JSON web API, and implement it in NodeJS.

The design would clearly describe the result of each different query to the web API, and give examples of output. We do not want to impose a specific framework, but the url structure will aim to be harmonized with other MetaBrainz projects.

You will be expected to use test driven development, as well as prepare a documentation that will be available for the public.

You will also participate in preparing the Docker image used to run the API in production, and how to integrate it into MetaBrainz’ hosting architecture.

Use Solr search engine

Proposed Mentors: Monkey
Languages/skills: Node.js, Solr, (PostgreSQL, Docker)

Forum for discussion


BookBrainz currently uses ElasticSearch for its search engine, and we are aiming to replace it in favor of Solr.


This will simplify hosting BookBrainz on the same infrastructure as the other MetaBrainz projects and harmonize the technologies we use. ElasticSearch is also quite resource intensive and creating some issues for developers on slower computers.

A good understanding of NodeJS and ExpressJS is required to find and replace the relevant components in the web server.

You will set up Solr for use with Bookbrainz' schema, drawing inspiration from existing MusicBrainz code.

On the Node side, you will aim to reproduce the current search functionalities (have a look here ), including updating the Solr index on creation/modification of entities (as described in the docs . Currently this is done like this for ES). In addition, we would like to add pagination to the search page, which should be fairly simple to achieve with Solr.

Communicating with Solr can be done simply via HTTP requests. If needed, it could otherwise be done using a JS library if deemed suitable.

You will also be involved in the preparation of the production deployment, adapting existing Docker configurations from MusicBrainz.

Design and implement a unified creation form

Proposed Mentors: Monkey
Languages/skills: User interfaces, User Experience, React, Node.js

Forum for discussion

If you are familiar with BookBrainz, you will know that each entity has a separate creation form. You can see these in the website's menu bar under "+ Add".

This leads to a complex workflow for simple use cases (such as 'adding a book') and repeating data (for example the title of a work repeated for an edition and an edition group, in a simple use case of a book), increasing chances of making errors. Such an evident workflow should be straightforward (especially for inexperienced users), and we ask you to design and implement a single form that will improve the editing experience.

Tabs will likely be necessary to separate the different entities forms as steps. For each step, entities can be searched for or created, with the full range of options the current forms do. The form will automatically link together the various entities accordingly.

Keep in mind that "adding a book" is a simple case, and that we should be able to optionally enter more complicated cases (for example an anthology of short stories will have multiple Works, and the title of the Edition may be different from any of the Works it contains).

The first phase should be to make a mockup with a prototyping/wireframing tool such as Sketch, Figma or Pencil Project. You will be expected to develop the components using MetaBrainz' new React-storybook design system. We will work together iteratively during both the UX and development sections of the project.

User collections

Proposed Mentors: Monkey
Languages/skills: React, Node.js, User Experience, SQL

Forum for discussion

With all this data available, it would be great if BookBrainz users could use the website to save the books they have read, mark the ones they would like to read, mark gifts ideas, etc.

Using test-driven development, you will develop a user collection feature that will allow users to create, organize and retrieve collections.

A collection can only contain one type of entity (Author, Work, Edition Group, etc.). A user can create an arbitrary number of collections with an arbitrary number of items in it. A collection can be set to private or public, and can have an optional description.


On the front-end, there should be a new page (`/user/{USERNAME}/collections`) to view another user's public collections, or view and manage (edit name, set private/public and description, delete) all one's own collections.

Each collection has its own page for display purposes, where a user can remove and add items, and change the collection's settings.


There should also be easily accessible ways of adding entities to your collections, at the very least in the entity display pages, but also possibly in the search page, homepage, etc. You will suggest appropriate places for such buttons.

Clicking on an "add to collection" button will require to show a component to choose which collection to add to (filtered by type corresponding to the entity to add), or to create a new collection on the fly.


Using a prototyping/wireframing tool will help for the design and user experience iterations. You will learn to use MetaBrainz' new React-based design system


This feature could also help us build a recommendation engine in the future, along with data from CritiqueBrainz.