Skip to content

Get site ready for MVP: various fixes and additions - #18

Merged
falquaddoomi merged 110 commits into
mainfrom
various-fixes
Jul 10, 2026
Merged

Get site ready for MVP: various fixes and additions#18
falquaddoomi merged 110 commits into
mainfrom
various-fixes

Conversation

@falquaddoomi

@falquaddoomi falquaddoomi commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

This PR is a collection of minor fixes for issues brought up in our June 12th meeting.

A non-exhaustive list of tasks I could see being included in this PR:

  • VR: integrate “performance” field on the combobox on the landing page
  • VR: integrate “meta->performance” field on the study results page
  • VR: (from FA) search box disappears if there aren’t any results, making it impossible to fix the search query if it returns nothing
  • VR: make platforms into a combobox, and maybe other long facets
  • FA: merge global feedback stats into study results endpoint
  • FA: update confidence to be numeric (min, max): 0-100, update backend to handle that
  • FA: update study sizes to return min/max
  • FA: make the search box on the sample results page work
  • FA: import, add external databases references (archs4, recount3, refine.bio) to study response
    • FA: replace existing "database" field with a merge of GEOSeriesDatabase and ExternalDbRefs, update frontend schema accordingly
    • FA: add a facet + filters for the external database references
  • FA: compute facets over the entire dataset rather than computing on the fly for the current query
  • FA: allow users to overwrite their vote without creating duplicate feedback entries for a single user/series pair
  • FA: add /api/stats/ endpoint for database-level statistics

Details

These details are just for things I've completed so far; as I complete more I'll update this section.

Aggregated Feedback for Studies

Study responses now include a dict of the following form:

"feedback": {
   "vote_count": int,
}

EDIT: Changed this to just return vote_count to show review activity rather than information about likes/dislikes, since VR brought up that these statistics can influence reviewers.

(Since we're moving to global facets, we'll be removing caching from the study endpoints filter entirely, which obviates the need to update the caching policy to account for user-generated feedback. I removed the text I'd written about caching because of that.)

Sample Search

The query argument submitted by the sample search box now filters sample results on the backend; the search box searches the following fields in GEOSample:

  • gsm (sample IDs)
  • title
  • data_processing
  • description
    Again, I chose ones that looked informative.

@vincerubinetti one minor thing, if you enter a query that returns 0 results, the UI for the search box disappears making it impossible to correct the query.

External Databases (work-in-progress)

Study responses will include each study's presence in the external databases archs4, recount3, and refine.bio. These will be merged under the existing database key, alongside the current records derived from GEOSeriesDatabase. The database key will have the following form:

"database": {
  <db_name:str>: {
    "external_id": <external_db_id:str | null | undefined>
    "url": <url:str | null | undefined>
  },
  ...
}

db_name is from the set ("archs4", "recount3", "refine.bio"). Each of the subkeys, "external_id" or "url" is optional, and either can also be null (if the record is found, but not value was provided, e.g. for archs4).

Currently, I lack external DB IDs for archs4, so that field will be null for all archs4 entries. Let me know if you'd prefer for me to model it some other way, happy to change it.

@netlify

netlify Bot commented Jun 19, 2026

Copy link
Copy Markdown

Deploy Preview for m2on ready!

Name Link
🔨 Latest commit 885b613
🔍 Latest deploy log https://app.netlify.com/projects/m2on/deploys/6a5020fc9d9cc5000818f472
😎 Deploy Preview https://deploy-preview-18--m2on.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@vincerubinetti

Copy link
Copy Markdown
Collaborator

@vincerubinetti one minor thing, if you enter a query that returns 0 results, the UI for the search box disappears making it impossible to correct the query.

I'm actually not able to observe this, can you show a screenshot? If you're referring to the study search results page, some time ago I changed it to not show the search box at all (regardless of # of results) until you click "new search".

Currently, I lack external DB IDs for archs4, so that field will be null for all archs4 entries. Let me know if you'd prefer for me to model it some other way, happy to change it.

Currently the frontend just looks for database: string[] on the study result object, where the strings are just ids in the form of: Refine.bio, ARCHS4, Recount3, GEO, SRA, BioStudies, BioProject, ArrayExpress, Peptidome. Idk what "external ids" means, but I don't think I'm using them. I'm just using those "standard" db names to look up a description, link, etc. from a map hard-coded in the frontend, and that's what I show in tooltips and such.

EDIT: Changed this to just return vote_count to show review activity rather than information about likes/dislikes, since VR brought up that these statistics can influence reviewers.

Feel free to return as much as you want here. I do think votes can influence users, but I don't see it as a huge risk to expose up/down vote counts in the API. I know it's easy for you to add them back in later, but I figure it's probably even easier to just have them there in the API response and just update the frontend to show them. And perhaps we could use the up/down info in the frontend in some other way than just displaying them (idk, like asking extra questions if the user downvotes something that is heavily upvoted by everyone else).


For expediency and my own sanity, I'm working on just bringing in changes from the other PRs right now (except for the schema one) and resolving the conflicts by hand. I don't think this will affect your backend work any more than it already will be.

Then my plan is to come back later and do the auto-schema generation (and useQuery simplification) and field normalization.

@vincerubinetti vincerubinetti changed the title Various Site Fixes Get site ready for MVP: various fixes and additions Jun 22, 2026
This was referenced Jun 22, 2026
@falquaddoomi

falquaddoomi commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator Author

I'm actually not able to observe this, can you show a screenshot? If you're referring to the study search results page, some time ago I changed it to not show the search box at all (regardless of # of results) until you click "new search".

Here's a short video demonstrating the behavior:

Screen.Recording.2026-06-23.at.10.10.30.AM.mov

Currently the frontend just looks for database: string[] on the study result object, where the strings are just ids in the form of: Refine.bio, ARCHS4, Recount3, GEO, SRA, BioStudies, BioProject, ArrayExpress, Peptidome. Idk what "external ids" means, but I don't think I'm using them. I'm just using those "standard" db names to look up a description, link, etc. from a map hard-coded in the frontend, and that's what I show in tooltips and such.

I recently changed the type of database to record[{url: str | null | undefined, external_id: str | null | undefined}]; I also updated the frontend code where database badges are displayed (Search and Cart) to treat it the same way as the string[], i.e. to use the key of the record as the name and to ignore the rest. AFAIK the URL/external id link to or otherwise identify the corresponding entry for the series in the target database, but I think it's fine to ignore them and just link to the database's homepage directly, at least until we hear otherwise.

Feel free to return as much as you want here. I do think votes can influence users, but I don't see it as a huge risk to expose up/down vote counts in the API. I know it's easy for you to add them back in later, but I figure it's probably even easier to just have them there in the API response and just update the frontend to show them. And perhaps we could use the up/down info in the frontend in some other way than just displaying them (idk, like asking extra questions if the user downvotes something that is heavily upvoted by everyone else).

Sure; I re-added likes and dislikes back into the response. While I usually try to avoid returning anything that we don't anticipate showing to a user, I assume that the main reason we're not showing the likes and dislikes is to avoid people having knee-jerk reactions. If they want to inspect the response and find it there I presume they're out of the period in which they'd have an automatic response to seeing the ratings.

falquaddoomi and others added 16 commits July 6, 2026 15:25
…ests those columns anyway, leading to N+1 queries
…selected techs. Adds commented-out technologies serializer field in case we eventually need it.
…mit it to just entries for which we have predictions
… fixes samples relation to restrict to SearchTerm-identified GEOSeries
Previously, the payload specified start: true, however this begins the data normalization and downloading procedure for a user. This requres a token and the user must agree to refine.bio's licensing agreement. I changed the start value to false and removed the quantile_normalized, quant_sf_only, and svd_algorithm. This will still create a refine.bio dataset and users will go there to select the download parameters on the the refine.bio download page. We can probably get rid of the email input too since that is also related to starting the processing and downloading procedure.
@phicks22

phicks22 commented Jul 9, 2026

Copy link
Copy Markdown
Member

@vincerubinetti I know why the refine.bio export isn't working. In the refine.bio module (refine.bio.ts), the POST payload specified data processing and normalization arguments, and also specified start: true.

The start key specifies that the data normalization and preprocessing step should start, however users need their own token and need to accept the refine.bio user agreement to do this. We can still create and populate the dataset and share the link with users (this is what I do in MetaHQ), but they must accept the terms and conditions on the refine.bio's download page.

I removed any payload keys related to data processing and specified start: false. I can confirm these parameters work on the refine.bio export functionality I have in MetaHQ

I pushed these changes in 2153fe9.

@falquaddoomi

Copy link
Copy Markdown
Collaborator Author

Thanks all for your contributions! Merging this now and will deploy to production soon after.

@falquaddoomi
falquaddoomi merged commit 6b6edb4 into main Jul 10, 2026
5 checks passed
@falquaddoomi
falquaddoomi deleted the various-fixes branch July 10, 2026 18:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Search button currently links to empty search result MVP feedback system

3 participants