<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
<div class="" data-tab="preview"><p>Hello everyone,<br></p><p>I wish to build <a target="_blank" href="https://github.com/sugarlabs/GSoC/blob/master/Ideas-2020.md#sugar-app-store-for-python-3-activities-aslov4" rel="noopener noreferrer">app store for python 3 activities</a>. For this I would like to inquire exact requirements of the project from the mentors and community at large.<br></p><p>Below is my current understanding of project. Please read through it 
and correct where these are wrong. After it are some questions to answer
 to further improve my understanding. Some of these are merely more 
elaborate rewording of requirements specified on <a target="_blank" href="https://github.com/sugarlabs/GSoC/blob/master/Ideas-2020.md#sugar-app-store-for-python-3-activities-aslov4" rel="noopener noreferrer">website</a>. It is meant to detect possible misunderstanding that I may have from reading very brief one-line requirements.<br></p><p>After few responses for this mail, a draft requirements document will 
be mailed for feedback before final requirements specification.<br></p><h1 id="objective">Objective<br></h1><ul><li>The objective of app store is to provide a one-stop platform for 
students to browse or search and download activities to their system. It
 is expected than once the app store is built, students would not have 
to search for activities over internet, on GitHub or on wiki and download
 from there.<br></li><li>Sugar will use app store to automatically upgrade newer version of activities.<br></li></ul><h1 id="users-of-app-store">Users of app store<br></h1><ul><li><b>Students</b>: search and browse app store for activities and download them if not already installed.<br></li><li><b>Trusted developers</b>: add and modify activities to 
app store via SSH and than check them on app store. These are trusted 
developers and not all the developers. Their role would be similar to 
package managers for distros. That is, most of the times, the developer 
who built activity would not be the one who uploads it but request 
trusted developer to grant access or upload themselve.<br></li><li><b>Sugar desktop environment/OS</b>: check for current version on app store and if new version found than download and upgrade activities on local machine.<br></li></ul><h1 id="user-interface">User-interface<br></h1><ul><li>The user interface/frontend of app store would be catering to 
students primarily and therefore must be built keeping them in mind 
rather than developers. But developers would still use it (or not?), 
therefore there would be some consideration of them and providing 
information relevant to them such as version of app, size, 
detailed/complete release note, website/link to repository, license etc.<br></li><li>Special attention needs to be made towards user experience and 
usability. Such as web app should be responsive, delightful to use by 
students. For this, some artwork also needs to be built such as logo of 
app store, button icons, background etc.<br></li></ul><h1 id="functionalities">Functionalities<br></h1><ul><li><b>Upload activities to app store using SSH</b>: Trusted 
developers with access granted/account created for this specific purpose
 can upload activities to app store and have parameters to specify such 
as markdown supported detailed description of activities etc. but 
information which is available in activity.info will not be asked/cannot
 be specified in parameters while uploading, instead it will be processed directly by parsing activity.info file.<br></li><li><b>Search box</b>: There will be a single search input 
field in which user enters search query. Thee are no complicated search 
query features such as selecting category, no. of entries per page etc. 
At backend, based on query keywords either a) a simple keyword match is 
performed and results are returned in order in which received. b) some 
search improvement processing is done such as a rank based search prioritizing keyword matches in activities tile over activities 
description. There will/will not (please inform) functionality to sort 
search results based on activities last updated or added, no. of 
downloads etc.<br></li><li><b>Redirect older Sugar to <a target="_blank" href="https://activities.sugarlabs.org/en-US/sugar/" rel="noopener noreferrer">python 2 app store</a></b>:
 Redirect only Fedora 18 or earlier version based Suger 0.112 or earlier
 version to <a href="https://activities.sugarlabs.org/" rel="noopener noreferrer" target="_blank">activities.sugarlabs.org</a>. Suger 0.112 or earlier desktop
 environment is not running on any other distribution other than Fedora 
18 or earlier or not needed to be checked for.<br></li><li><b>List activities</b>: There will be a category in browse 
section of app store named “All activities”, using it user can browse 
through all activities and not just in some specific activity.<br></li><li><b>Support for Sugar’s microformat software upgrade feature</b>:
  Embed CSS selectors and HTML data on activity bundles page and activity bundle list page, to allow microformats based Sugar software 
upgrade feature to check and automatically update activities when new 
version available on app store. Should there be a page listing all 
activity bundles where Sugar software upgrade feature will check for 
updates or should I follow the same tree structure as <a target="_blank" href="http://wiki.laptop.org/go/Activities/" rel="noopener noreferrer">on wiki</a> or should there be a way to let know Sugar of dedicated page of each 
activity bundle to check for update (but modification to activity.info 
is not allowed)?<br></li><li><div><b>Content-Type</b>: When user downloading activity bundle 
from app store, server sends Content-Type header in response with the content-type of sugar activities that is: <br></div><ul><li>application/vnd.olpc-sugar for Sugar activity bundle (extension .xo)<br></li><li>application/vnd.olpc-content for Sugar content bundle (extension .xol).<br></li><li>application/vnd.olpc-journal-entry for Sugar Journal entry bundle (extension .xoj)<br></li><li>application/vnd.olpc-journal-backup for Sugar Journal backup files (extension .xob)<br></li></ul></li></ul><p>There would not be any other file than .xo but better to have 
information for all file types used by Sugar in app store software.<br></p><ul><li><b>Automatically update activities from activities repository specified in activity.info file</b>:
 A standard recipe/script is to be made for server/app store to 
periodically check for newer release under ‘releases’ section of activities hosted on GitHub and automatically create its bundle and add 
it to the app store. However, it will not be done for all activities
which specify its website/repository as GitHub repository but only for 
those which are whitelisted by website admin/trusted developers as 
trusted repositories for security reasons and all GitHub repositories 
starting with <a target="_blank" href="https://github.com/sugarlabs/" rel="noopener noreferrer">https://github.com/sugarlabs/</a> i.e. hosted by Sugar labs organization.<br></li><li><b>Inform if activity is already installed</b>: Wherever 
on app store, there will be download buttons for activities, A check will
 be performed if activity bundles are already installed on system. If so,
 than download button colour will be changed and “already installed” 
will be displayed below it. But, user can still download it. This need 
to be accomplished without modifying activities and should work for all activities available on app store. So, options which rely on modifying 
app itself are out of option but Sugar can be modified to support this 
functionality such supporting something similar to 
getInstalledRelatedApps() in Android.<br></li><li><b>Download count</b>: Every activity bundle should 
display no. of times it is downloaded. It should include download count 
of all previous version as well.<br></li></ul><h1 id="development">Development<br></h1><ul><li>Use general database such as MySQL/MariaDB for storing all textual 
data such as app title, description, author name etc. and use their 
in-built search functionality to perform search (after sanitizing 
input).<br></li><li>The website will not be using JavaScript to make requests and update page dynamically.<br></li></ul><h1 id="constraints">Constraints<br></h1><ul><li>Activities itself won’t be modified including their metadata file 
located at activity/activity.info in their source tree for supporting 
any of the required feature. Request for modifying metadata should not 
be made such as for adding detailed description and instead should be fetched from their repository or options should be provided for 
specifying description while uploading activity bundle via SSH.<br></li></ul><h1 id="security">Security<br></h1><ul><li>Only developers which have been provided access in advance can 
upload activities to app store. Some may have admin access, so they can 
add other developers as well. A simple CLI script should be provided to 
easily add new developers and their access level as ‘can upload new 
activities’, ‘can modify specified activity’ and admin access.<br></li></ul><h1 id="additional-questions">Additional Questions<br></h1><ol><li>Developer uploading activities via SSH? Will access to uploading activities be with few trusted developers (my assumption as of now) or 
anyone can upload activities to app store once approved.<br></li><li>Future considerations: how far is the app store expected to grow in 
future in terms of its scope and functionalities. What considerations 
should be kept in mind if app store functionalities and codebase is 
expected to be a lot bigger in future.<br></li><li>Is programming language to be used for backend is per-decided to be 
Python or can be JavaScript as well? I am comfortable with using any of the
 two. My suggested framework for Python is Flask and if JavaScript is 
used than Express.js. I also suggest using MySQL database similar to <a href="https://github.com/sugarlabs/aslo" rel="noopener noreferrer" target="_blank">aslo</a> for backend 
for storing and looking up activities metadata but store activities 
bundles as normal files on disk. Is their any reverse proxy used on 
server where it will be installed such as Nginx or Apache?<br></li></ol><p>Please give your comments on these questions.<br></p><p></p><div>Regards,<br></div><div>Manish<br></div><p></p><div><br></div></div><div><br></div>  </body>
</html>