{"id":25201928,"url":"https://github.com/sul-dlss/mylibrary","last_synced_at":"2026-05-18T18:01:20.533Z","repository":{"id":40652081,"uuid":"193162505","full_name":"sul-dlss/mylibrary","owner":"sul-dlss","description":"My Library Account - an application for checkouts, renewals, requests, and fines","archived":false,"fork":false,"pushed_at":"2026-05-11T19:18:06.000Z","size":4058,"stargazers_count":2,"open_issues_count":35,"forks_count":2,"subscribers_count":14,"default_branch":"main","last_synced_at":"2026-05-11T21:17:37.234Z","etag":null,"topics":["access","application","libsys","rails","ruby"],"latest_commit_sha":null,"homepage":"https://mylibrary.stanford.edu","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sul-dlss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-06-21T21:33:35.000Z","updated_at":"2026-05-11T19:10:53.000Z","dependencies_parsed_at":"2023-09-22T04:48:43.085Z","dependency_job_id":"6be14526-fb76-4781-8ace-43992fa69ac9","html_url":"https://github.com/sul-dlss/mylibrary","commit_stats":null,"previous_names":[],"tags_count":169,"template":false,"template_full_name":null,"purl":"pkg:github/sul-dlss/mylibrary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sul-dlss%2Fmylibrary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sul-dlss%2Fmylibrary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sul-dlss%2Fmylibrary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sul-dlss%2Fmylibrary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sul-dlss","download_url":"https://codeload.github.com/sul-dlss/mylibrary/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sul-dlss%2Fmylibrary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33186230,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access","application","libsys","rails","ruby"],"created_at":"2025-02-10T06:14:33.079Z","updated_at":"2026-05-18T18:01:20.509Z","avatar_url":"https://github.com/sul-dlss.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MyLibrary\n\n[![Build Status](https://github.com/sul-dlss/mylibrary/workflows/CI/badge.svg?branch=main)](https://github.com/sul-dlss/mylibrary/actions?query=workflow%3ACI+branch%3Amain)\n[![Code Climate](https://codeclimate.com/github/sul-dlss/mylibrary/badges/gpa.svg)](https://codeclimate.com/github/sul-dlss/mylibrary)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/a8f1c5dab3a53ffba586/test_coverage)](https://codeclimate.com/github/sul-dlss/mylibrary/test_coverage)\n\nMyLibrary is a patron facing application that displays library account information,\nrenews materials, cancels hold requests, makes payments of library fees and fines (via a hosted payment gateway),\nand other features enhancing library user experience.\n\n## Requirements\n\n1. Ruby (3.1 or greater)\n2. Bundler\n3. Connection to FOLIO + Folio GraphQL API\n\n## Installation\n\nClone the repository\n\n    $ git clone https://github.com/sul-dlss/mylibrary.git\n\nChange directories into the app and install dependencies\n\n    $ bundle install\n    $ yarn install\n\nStart the development server\n\n    $ bin/dev\n\n## Configuring\n\nThe MyLibrary app will be configuired to connect to various backend web services, particularly FOLIO and\nILLiad Web Services. This will likely happen on an environment to enviroment basis via `config/settings`, so that (e.g.) `development` mode will point to `okapi-test` for FOLIO endpoints, `sul-folio-graphql-test` for our custom graphql interface to FOLIO, and `sul-illiad-test`.\n\n### Web Services Connectivity\n\nFor running the application in development mode you will need to connecting from a Stanford IP address (LAN, WiFi, or VPN)\nin order to sucessfully make web services requests. Furthermore, ILLiad Web services requires an API key which will be\nmade available via a `shared_configs` file.\n\n## Development\n\n### Authentication\n\nThe application has two main modes of authentication:\n\n- login by library id + pin\n- login via shibboleth\n\nBoth logins require access to the FOLIO web services (see above) to retrieve a patron key. Logging in via shibboleth requires a properly configured Shibboleth environment with access to Stanford's LDAP attributes. In development, the shibboleth login can be faked by setting the `REMOTE_USER` environment variable when starting the rails server, e.g.:\n\n```\n$ REMOTE_USER=someuser bin/dev\n```\n\nNote, again, that the user must exist in FOLIO as well; this is only a bypass for the shibboleth authentication.\n\n\n### FOLIO data\n\nThis application interacts with the FOLIO ILS. Our `FolioClient` class hits the FOLIO Okapi API gateway located at `folio.okapi_url` in the settings file. `FolioClient` also delegates some requests to our `FolioGraphqlClient`, which hits a custom endpoint specified at `folio.graphql_url` in settings. Some data required for this application, such as patron info, is better served by our custom API than Okapi because we are able to design the responses. You can find our repository for the graphql API at [https://github.com/sul-dlss/folio-graphql](https://github.com/sul-dlss/folio-graphql).\n\n## A note about payments to Cybersource\nCybersource (a company owned by VISA) is our external payment processor for paying library fines. Cybersource offers several products; the one that we use is called \"Secure Acceptance Hosted Checkout\" because it is an externally-hosted system where the user goes to complete payment. The Cybersource website is frequently updated and links may break; the only reliable source of documentation about our particular product is the [Developer Guide PDF](https://developer.cybersource.com/library/documentation/dev_guides/Secure_Acceptance_Hosted_Checkout/Secure_Acceptance_Hosted_Checkout.pdf).\n\nWe currently support only one type of transaction: paying all of a user's payable fines together at once. When the user clicks the \"pay all\" button, we redirect their request to Cybersource via an interstitial form, which generates a POST request containing the data that sets up the checkout form along with a security signature. When the user completes their payment, Cybersource will POST some information back to us, including some of the information we originally sent which identifies the user and how much they paid. We pass this information to the ILS client to actually do the work of marking the fines as having been paid.\n\n## Testing\n\nThe test suite (with RuboCop style enforcement) will be run with the default rake task (also run on travis)\n\n    $ rake\n\nThe specs can be run without RuboCop enforcement\n\n    $ rake spec\n\nThe RuboCop style enforcement can be run without running the tests\n\n    $ rake rubocop\n\n## Deployment\n\nDeployment of the application will be handled using the DLSS capistrano gem. To deploy the app to the development application\nserver run:\n\n    $ cap dev deploy\n\n## Feedback\n\nYou can provide feedback on MyLibrary through the \"Feedback\" link on the homepage. The [feedback queue](https://jirasul.stanford.edu/jira/projects/MYLIBACCNT) is managed in SUL JIRA.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsul-dlss%2Fmylibrary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsul-dlss%2Fmylibrary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsul-dlss%2Fmylibrary/lists"}