├── .nvmrc ├── Procfile ├── test ├── bootstrap.cjs ├── data │ ├── github │ │ ├── github.auth.token.js │ │ └── github.issue.error.js │ └── stripe │ │ ├── stripe.customer.js │ │ ├── balance.transaction.js │ │ └── stripe.invoiceitem.js ├── authenticate.sequelize.test.js └── ping.test.js ├── frontend ├── .mocharc.yaml ├── tests │ └── components │ │ └── __mocks__ │ │ ├── fileMock.js │ │ └── react-intl.js ├── src │ ├── components │ │ ├── areas │ │ │ ├── private │ │ │ │ └── features │ │ │ │ │ ├── projects │ │ │ │ │ ├── project-issue-table.tsx │ │ │ │ │ └── project-page.styles.ts │ │ │ │ │ ├── account │ │ │ │ │ ├── features │ │ │ │ │ │ ├── account-details │ │ │ │ │ │ │ └── account-details.css │ │ │ │ │ │ └── account-skills │ │ │ │ │ │ │ ├── skill.styles.ts │ │ │ │ │ │ │ └── my-skill.tsx │ │ │ │ │ └── components │ │ │ │ │ │ └── account-tab-main.styles.ts │ │ │ │ │ └── payout-settings │ │ │ │ │ └── pages │ │ │ │ │ └── payout-settings-paypal-page.tsx │ │ │ └── public │ │ │ │ └── features │ │ │ │ ├── welcome │ │ │ │ └── pages │ │ │ │ │ ├── home-page.tsx │ │ │ │ │ └── welcome-page.tsx │ │ │ │ ├── pricing │ │ │ │ └── pages │ │ │ │ │ └── pricing-page.tsx │ │ │ │ ├── team │ │ │ │ └── pages │ │ │ │ │ └── team.tsx │ │ │ │ ├── session │ │ │ │ └── pages │ │ │ │ │ ├── signin-page.tsx │ │ │ │ │ ├── forgot-page.tsx │ │ │ │ │ ├── account-activation-page.tsx │ │ │ │ │ └── signup-page.tsx │ │ │ │ ├── explore │ │ │ │ └── pages │ │ │ │ │ ├── explore-projects-page.tsx │ │ │ │ │ └── explore-organization-page.tsx │ │ │ │ └── profile │ │ │ │ └── pages │ │ │ │ └── profile-page.tsx │ │ └── design-library │ │ │ ├── organisms │ │ │ ├── forms │ │ │ │ ├── paypal-info-form │ │ │ │ │ └── paypal-info-form.tsx │ │ │ │ ├── bank-account-forms │ │ │ │ │ └── bank-account-form │ │ │ │ │ │ └── bank-account-form.styles.ts │ │ │ │ ├── payout-forms │ │ │ │ │ ├── payout-request-form │ │ │ │ │ │ └── payout-request-form.styles.ts │ │ │ │ │ └── payout-schedule-form │ │ │ │ │ │ ├── payout-schedule-form.styles.ts │ │ │ │ │ │ └── payout-schedule-form.stories.tsx │ │ │ │ ├── price-forms │ │ │ │ │ └── price-plan-form │ │ │ │ │ │ └── price-plan-form.styles.ts │ │ │ │ ├── signup-forms │ │ │ │ │ └── signup-signin │ │ │ │ │ │ ├── signup-signin.stories.tsx │ │ │ │ │ │ └── signup-signin.styles.ts │ │ │ │ ├── payment-request-forms │ │ │ │ │ └── payment-request-form │ │ │ │ │ │ └── payment-request-form.styles.ts │ │ │ │ ├── issue-forms │ │ │ │ │ └── import-issue │ │ │ │ │ │ └── import-issue.stories.tsx │ │ │ │ └── subscribe-forms │ │ │ │ │ └── subscribe-form │ │ │ │ │ └── subscribe-form.stories.tsx │ │ │ └── layouts │ │ │ │ ├── page-layouts │ │ │ │ └── issue-page-layout │ │ │ │ │ └── issue-page-layout.styles.ts │ │ │ │ └── bottom-bar-layouts │ │ │ │ └── bottom-bar-layout │ │ │ │ └── bottom-bar-layout.stories.tsx │ │ │ ├── molecules │ │ │ ├── cards │ │ │ │ ├── billing-info-card │ │ │ │ │ └── billing-info-card.stories.tsx │ │ │ │ ├── issue-cards │ │ │ │ │ └── issue-invite-card │ │ │ │ │ │ └── issue-invite-card.styles.ts │ │ │ │ ├── payment-cards │ │ │ │ │ └── wallet-payment-card │ │ │ │ │ │ └── wallet-payment-card.styles.ts │ │ │ │ ├── dashboard-cards │ │ │ │ │ ├── claims-dashboard-card │ │ │ │ │ │ └── claims-dashboard-card.styles.ts │ │ │ │ │ ├── payments-dashboard-card │ │ │ │ │ │ └── payments-dashboard-card.styles.ts │ │ │ │ │ ├── payouts-dashboard-card │ │ │ │ │ │ └── payouts-dashboard-card.styles.ts │ │ │ │ │ ├── wallets-dashboard-card │ │ │ │ │ │ └── wallets-dashboard-card.styles.ts │ │ │ │ │ ├── bank-account-dashboard-card │ │ │ │ │ │ ├── bank-account-dashboard-card.styles.ts │ │ │ │ │ │ └── bank-account-dashboard-card.stories.tsx │ │ │ │ │ ├── my-issues-dashboard-card │ │ │ │ │ │ └── my-issue-dashboard-card.styles.ts │ │ │ │ │ ├── payment-requests-dashboard-card │ │ │ │ │ │ └── payment-requests-dashboard-card.styles.ts │ │ │ │ │ └── dashboard-card-list │ │ │ │ │ │ └── dashboard-card-list.styles.ts │ │ │ │ ├── project-card │ │ │ │ │ └── project-card.styles.ts │ │ │ │ ├── organization-card │ │ │ │ │ └── organization-card.styles.ts │ │ │ │ ├── spot-card │ │ │ │ │ └── spot-card.styles.ts │ │ │ │ └── balance-card │ │ │ │ │ └── balance-card.styles.ts │ │ │ ├── drawers │ │ │ │ ├── actions │ │ │ │ │ └── payments │ │ │ │ │ │ └── issue-order-details-action │ │ │ │ │ │ └── issue-order-details.styles.ts │ │ │ │ ├── issue-offer-drawer │ │ │ │ │ └── issue-offer-drawer.styles.ts │ │ │ │ ├── drawer │ │ │ │ │ ├── drawer-actions │ │ │ │ │ │ └── drawer-actions.styles.ts │ │ │ │ │ └── drawer.styles.ts │ │ │ │ └── offer-drawer │ │ │ │ │ └── components │ │ │ │ │ ├── offer-drawer-create.styles.ts │ │ │ │ │ └── actions.styles.ts │ │ │ ├── tables │ │ │ │ └── section-table │ │ │ │ │ ├── section-table-custom-fields │ │ │ │ │ ├── base │ │ │ │ │ │ ├── status-field │ │ │ │ │ │ │ └── status-field.stories.tsx │ │ │ │ │ │ ├── action-field │ │ │ │ │ │ │ └── action-field.tsx │ │ │ │ │ │ ├── text-field │ │ │ │ │ │ │ ├── text-field.tsx │ │ │ │ │ │ │ └── text-field.stories.tsx │ │ │ │ │ │ ├── created-field │ │ │ │ │ │ │ ├── created-field.stories.tsx │ │ │ │ │ │ │ └── created-field.tsx │ │ │ │ │ │ └── amount-field │ │ │ │ │ │ │ └── amount-field.stories.tsx │ │ │ │ │ ├── issue │ │ │ │ │ │ ├── issue-status-field │ │ │ │ │ │ │ └── issue-status-field.tsx │ │ │ │ │ │ ├── issue-created-field │ │ │ │ │ │ │ ├── issue-created-field.tsx │ │ │ │ │ │ │ └── issue-created-field.stories.tsx │ │ │ │ │ │ └── issue-price-field │ │ │ │ │ │ │ ├── issue-price-field.tsx │ │ │ │ │ │ │ └── issue-price-field.stories.tsx │ │ │ │ │ ├── payouts │ │ │ │ │ │ └── payout-status-field │ │ │ │ │ │ │ └── payout-status-field.tsx │ │ │ │ │ ├── transfer │ │ │ │ │ │ └── transfer-status-field │ │ │ │ │ │ │ └── transfer-status-field.tsx │ │ │ │ │ └── payment-request │ │ │ │ │ │ └── payment-request-active-field │ │ │ │ │ │ └── payment-request-active-field.stories.tsx │ │ │ │ │ └── section-table-pagination-actions │ │ │ │ │ └── section-table-pagination-actions.styles.ts │ │ │ ├── lists │ │ │ │ ├── requirements-list │ │ │ │ │ └── requirement-list.styles.ts │ │ │ │ ├── issue-author-list │ │ │ │ │ └── issue-author-list.styles.ts │ │ │ │ ├── issue-payments-list │ │ │ │ │ └── issue-payments-list.styles.ts │ │ │ │ ├── pickup-tag-list │ │ │ │ │ └── pickup-tag-list.styles.ts │ │ │ │ └── project-list │ │ │ │ │ └── project-list-full │ │ │ │ │ └── project-list-full.styles.ts │ │ │ ├── dialogs │ │ │ │ ├── issue-invite-dialog │ │ │ │ │ └── issue-invite-dialog.styles.ts │ │ │ │ ├── privacy-dialog │ │ │ │ │ └── privacy-dialog.tsx │ │ │ │ ├── terms-dialog │ │ │ │ │ └── terms-dialog.tsx │ │ │ │ ├── country-picker-dialog │ │ │ │ │ └── country-picker-dialog.stories.tsx │ │ │ │ └── bottom-section-dialog │ │ │ │ │ └── bottom-section-dialog.stories.tsx │ │ │ ├── headers │ │ │ │ ├── profile-secondary-header │ │ │ │ │ └── profile-secondary-header.styles.ts │ │ │ │ └── profile-main-header │ │ │ │ │ └── profile-main-header.styles.ts │ │ │ ├── menus │ │ │ │ ├── account-menu │ │ │ │ │ └── account-menu.styles.ts │ │ │ │ └── topbar-menu │ │ │ │ │ └── topbar-menu.stories.tsx │ │ │ ├── content │ │ │ │ ├── empty │ │ │ │ │ ├── empty-claim │ │ │ │ │ │ └── empty-claim.stories.tsx │ │ │ │ │ ├── empty-payout │ │ │ │ │ │ └── empty-payout.stories.tsx │ │ │ │ │ ├── empty-bank-account │ │ │ │ │ │ └── empty-bank-account.stories.tsx │ │ │ │ │ └── empty-payment-request │ │ │ │ │ │ └── empty-payment-request.stories.tsx │ │ │ │ ├── introduction │ │ │ │ │ └── introduction.stories.tsx │ │ │ │ └── issue-content │ │ │ │ │ ├── issue-content-placeholder.tsx │ │ │ │ │ └── issue-content.styles.ts │ │ │ ├── breadcrumbs │ │ │ │ └── breadcrumb │ │ │ │ │ └── breadcrumb.styles.ts │ │ │ ├── form-section │ │ │ │ ├── login-form │ │ │ │ │ ├── login-form-signin │ │ │ │ │ │ └── login-form-signin.stories.tsx │ │ │ │ │ ├── login-form-forgot │ │ │ │ │ │ └── login-form-forgot.stories.tsx │ │ │ │ │ └── login-form-reset │ │ │ │ │ │ └── login-form-reset.stories.tsx │ │ │ │ ├── card-number-form │ │ │ │ │ └── card-number-form.tsx │ │ │ │ └── personal-details-form │ │ │ │ │ └── personal-details.stories.tsx │ │ │ ├── tabs │ │ │ │ ├── bank-account-tabs │ │ │ │ │ └── bank-account-tabs.stories.tsx │ │ │ │ └── payout-settings-tabs │ │ │ │ │ └── payout-settings-tabs.stories.tsx │ │ │ ├── switchers │ │ │ │ └── language-switcher │ │ │ │ │ ├── language-switcher.styles.ts │ │ │ │ │ └── language-switcher.stories.tsx │ │ │ └── sections │ │ │ │ └── stats-bar │ │ │ │ └── stats-bar.stories.tsx │ │ │ ├── pages │ │ │ ├── public-pages │ │ │ │ ├── session-public-pages │ │ │ │ │ └── account-activation │ │ │ │ │ │ └── account-activation.stories.tsx │ │ │ │ ├── issue-public-page │ │ │ │ │ └── issue-public-page.styles.tsx │ │ │ │ ├── user-profile-public-page │ │ │ │ │ └── user-profile-public-page.styles.ts │ │ │ │ ├── explorer-public-page │ │ │ │ │ └── explorer-public-page │ │ │ │ │ │ └── explorer-public-page.styles.ts │ │ │ │ ├── four-o-four-public-page │ │ │ │ │ └── four-o-four.stories.tsx │ │ │ │ └── pricing-public-page │ │ │ │ │ └── pricing-public-page.stories.tsx │ │ │ └── private-pages │ │ │ │ ├── settings-pages │ │ │ │ ├── account-settings │ │ │ │ │ └── account-settings.tsx │ │ │ │ └── payout-settings │ │ │ │ │ └── payout-settings.tsx │ │ │ │ └── data-pages │ │ │ │ └── primary-data-page │ │ │ │ └── primary-data-page.styles.ts │ │ │ ├── atoms │ │ │ ├── transitions │ │ │ │ └── transition.js │ │ │ ├── buttons │ │ │ │ ├── import-issue-button │ │ │ │ │ ├── import-issue-button.styles.ts │ │ │ │ │ └── import-issue-button.stories.tsx │ │ │ │ ├── button │ │ │ │ │ └── button.styles.ts │ │ │ │ ├── issue-actions │ │ │ │ │ └── issue-actions.tsx │ │ │ │ ├── signin-buttons │ │ │ │ │ └── signin-buttons.stories.tsx │ │ │ │ └── provider-login-buttons │ │ │ │ │ ├── provider-login-buttons.stories.tsx │ │ │ │ │ └── provider-login-buttons.styles.ts │ │ │ ├── inputs │ │ │ │ ├── fields │ │ │ │ │ ├── field │ │ │ │ │ │ └── field.styles.ts │ │ │ │ │ ├── account-type-field │ │ │ │ │ │ └── account-type.stories.tsx │ │ │ │ │ ├── birth-date-field │ │ │ │ │ │ └── birth-date-field.stories.tsx │ │ │ │ │ ├── phone-number-field │ │ │ │ │ │ └── phone-number-field.stories.tsx │ │ │ │ │ ├── bank-select-field │ │ │ │ │ │ └── bank-select-field.stories.tsx │ │ │ │ │ └── country-field │ │ │ │ │ │ └── country-field.stories.tsx │ │ │ │ ├── input-comment │ │ │ │ │ ├── input-comment.styles.ts │ │ │ │ │ └── input-comment.stories.tsx │ │ │ │ ├── checkbox-terms │ │ │ │ │ ├── checkbox-terms.styles.ts │ │ │ │ │ └── checkbox-terms.stories.tsx │ │ │ │ ├── radios │ │ │ │ │ ├── radios.styles.ts │ │ │ │ │ └── radios.stories.tsx │ │ │ │ ├── solution-input │ │ │ │ │ └── solution-input.styles.ts │ │ │ │ ├── checkboxes │ │ │ │ │ └── checkboxes.styles.ts │ │ │ │ ├── price-input │ │ │ │ │ └── price-input.styles.ts │ │ │ │ ├── dropdowns │ │ │ │ │ └── issue-level-dropdown │ │ │ │ │ │ └── issue-level-dropdown.stories.tsx │ │ │ │ └── fieldset │ │ │ │ │ └── fieldset.tsx │ │ │ ├── alerts │ │ │ │ ├── account-requirements │ │ │ │ │ └── account-requirements.styles.ts │ │ │ │ ├── alert │ │ │ │ │ └── alert.styles.ts │ │ │ │ └── simple-info │ │ │ │ │ ├── simple-info.tsx │ │ │ │ │ └── simple-info.styles.ts │ │ │ ├── filters │ │ │ │ ├── issue-filter │ │ │ │ │ └── issue-filter.styles.ts │ │ │ │ └── issue-status-filter │ │ │ │ │ └── issue-status-filter.stories.tsx │ │ │ ├── loaders │ │ │ │ ├── placeholders │ │ │ │ │ ├── avatar-placeholder.styles.ts │ │ │ │ │ ├── avatar-placeholder.tsx │ │ │ │ │ └── avatar-placeholder.stories.tsx │ │ │ │ └── loader │ │ │ │ │ ├── loader.tsx │ │ │ │ │ ├── loader.stories.tsx │ │ │ │ │ └── loader.styles.ts │ │ │ ├── typography │ │ │ │ ├── secondary-title │ │ │ │ │ └── secondary-title.stories.tsx │ │ │ │ └── context-title │ │ │ │ │ └── context-title.tsx │ │ │ └── status │ │ │ │ └── issue-status │ │ │ │ └── issue-status.stories.tsx │ │ │ └── templates │ │ │ └── base │ │ │ ├── public-base │ │ │ └── public-base.styles.ts │ │ │ └── private-base │ │ │ └── private-base.styles.ts │ ├── images │ │ ├── bounty.png │ │ ├── brazil.png │ │ ├── deal.png │ │ ├── funds.png │ │ ├── Fallback.png │ │ ├── login_bg.png │ │ ├── octodex.png │ │ ├── sharing.png │ │ ├── welcome1.png │ │ ├── welcome2.png │ │ ├── welcome3.png │ │ ├── discount-99.png │ │ ├── github-logo.png │ │ ├── gitlab-logo.png │ │ ├── gitpay-app.png │ │ ├── gitpay-logo.png │ │ ├── logo-symbol.png │ │ ├── paypal-icon.png │ │ ├── slack-logo.png │ │ ├── task-cover.png │ │ ├── task-icon.png │ │ ├── time-icon.png │ │ ├── tools-icon.png │ │ ├── welcome-bg.png │ │ ├── city-software.png │ │ ├── logo-complete.png │ │ ├── notifications.png │ │ ├── payment-icon.png │ │ ├── avatar-alexandre.png │ │ ├── bitbucket-logo.png │ │ ├── clients │ │ │ ├── client1.png │ │ │ ├── client2.png │ │ │ ├── client3.png │ │ │ ├── electron-logo.png │ │ │ ├── etherpad-logo.png │ │ │ ├── fitnowbrazil-logo.png │ │ │ └── sitespeedio-logo.png │ │ ├── countries │ │ │ ├── belize.png │ │ │ ├── brazil.png │ │ │ ├── canada.png │ │ │ ├── cyprus.png │ │ │ ├── france.png │ │ │ ├── ghana.png │ │ │ ├── greece.png │ │ │ ├── india.png │ │ │ ├── italy.png │ │ │ ├── japan.png │ │ │ ├── jordan.png │ │ │ ├── kenya.png │ │ │ ├── latvia.png │ │ │ ├── malta.png │ │ │ ├── mexico.png │ │ │ ├── norway.png │ │ │ ├── poland.png │ │ │ ├── spain.png │ │ │ ├── sweden.png │ │ │ ├── turkey.png │ │ │ ├── albania.png │ │ │ ├── austria.png │ │ │ ├── belgium.png │ │ │ ├── bulgaria.png │ │ │ ├── colombia.png │ │ │ ├── croatia.png │ │ │ ├── default.png │ │ │ ├── denmark.png │ │ │ ├── estonia.png │ │ │ ├── finland.png │ │ │ ├── germany.png │ │ │ ├── hungary.png │ │ │ ├── ireland.png │ │ │ ├── malaysia.png │ │ │ ├── nigeria.png │ │ │ ├── pakistan.png │ │ │ ├── portugal.png │ │ │ ├── romania.png │ │ │ ├── slovakia.png │ │ │ ├── slovenia.png │ │ │ ├── thailand.png │ │ │ ├── australia.png │ │ │ ├── bangladesh.png │ │ │ ├── gibraltar.png │ │ │ ├── hong-kong.png │ │ │ ├── indonesia.png │ │ │ ├── lithuania.png │ │ │ ├── luxembourg.png │ │ │ ├── netherlands.png │ │ │ ├── new-zealand.png │ │ │ ├── philippine.png │ │ │ ├── puerto-rico.png │ │ │ ├── singapore.png │ │ │ ├── sri-lanka.png │ │ │ ├── switzerland.png │ │ │ ├── liechtenstein.png │ │ │ ├── south-africa.png │ │ │ ├── czech-republic.png │ │ │ ├── united-kingdom.png │ │ │ ├── united-arab-emirates.png │ │ │ └── united-states-of-america.png │ │ ├── credit-card-icon.png │ │ ├── payment-icon-alt.png │ │ ├── teams │ │ │ ├── profile_rq.jpg │ │ │ ├── core-team-mayna.jpg │ │ │ ├── wharley-team-member.jpg │ │ │ ├── headhunter-team-member1.png │ │ │ └── headhunter-team-member2.png │ │ ├── welcome-teamwork.png │ │ ├── worknenjoy-logo.png │ │ ├── github-logo-black.png │ │ ├── github-logo-bottom.png │ │ ├── gitpay-logo-small.png │ │ ├── landingPage_People.png │ │ ├── logo-complete-gray.png │ │ ├── logo-symbol-small.png │ │ ├── main-background01.jpg │ │ ├── main-background02.jpg │ │ ├── main-background03.jpg │ │ ├── main-background04.jpg │ │ ├── main-background05.jpg │ │ ├── main-background06.jpg │ │ ├── main-background07.jpg │ │ ├── main-background08.jpg │ │ ├── main-background09.jpg │ │ ├── welcome-companies.png │ │ ├── welcome-freelancer.png │ │ ├── bitbucket-logo-blue.png │ │ ├── core-team-page-asset.png │ │ ├── backgrounds │ │ │ └── bg-mail-top.png │ │ ├── github-logo-alternative.png │ │ ├── octodex-professortocat.png │ │ ├── material-ui-icon-language.png │ │ ├── octodex-motherhubbertocat.png │ │ ├── united-states-of-america.png │ │ ├── gitpay-explore-task-screenshot.png │ │ ├── collections │ │ │ └── collection-flat-build.png │ │ └── octodex-motherhubbertocat-transparent.png │ ├── types │ │ ├── card.ts │ │ └── table.ts │ ├── common │ │ ├── selectors │ │ │ └── user │ │ │ │ └── getUser.js │ │ └── operator │ │ │ └── if.js │ ├── index.d.ts │ ├── index.js │ ├── containers │ │ ├── home.js │ │ ├── public-container.js │ │ ├── welcome.js │ │ ├── account-activation.ts │ │ ├── team.js │ │ ├── task-solve.js │ │ ├── task-filter.js │ │ ├── profile-head.js │ │ ├── provider-login-buttons.tsx │ │ ├── bottom.js │ │ ├── project-explorer.js │ │ └── info.js │ ├── main │ │ ├── authOrApp.js │ │ ├── app.css │ │ └── routes-sitemap.js │ ├── utils │ │ ├── valid-account.tsx │ │ └── format-currency.tsx │ ├── actions │ │ └── helpers │ │ │ └── index.js │ ├── reducers │ │ └── teamReducer.js │ ├── styleguide │ │ └── components │ │ │ └── Page.tsx │ └── stories │ │ └── Header.stories.jsx ├── public │ ├── favicon-gitpay.ico │ └── lottie │ │ ├── mission.lottie │ │ ├── coworking.lottie │ │ ├── how-it-works.lottie │ │ ├── startup-life.lottie │ │ ├── developer-main.lottie │ │ └── developer-team.lottie ├── translation.js ├── build │ └── messages │ │ └── src │ │ └── components │ │ └── profile │ │ └── preferences.json └── .storybook │ └── utils │ └── generateTableData.ts ├── .vscode ├── settings.json └── launch.json ├── .prettierignore ├── src ├── modules │ ├── paymentRequestBalance │ │ └── index.ts │ ├── paymentRequestPayments │ │ └── index.ts │ ├── label │ │ ├── index.js │ │ └── labelSearch.js │ ├── roles │ │ ├── index.js │ │ └── roleExists.js │ ├── assigns │ │ ├── index.js │ │ └── assignExists.js │ ├── members │ │ └── index.js │ ├── coupon │ │ └── index.js │ ├── types │ │ ├── index.js │ │ └── typeSearch.js │ ├── contact │ │ ├── index.js │ │ └── contactRecruiters.js │ ├── team │ │ ├── index.js │ │ └── requestJoinCoreTeam.js │ ├── projects │ │ ├── index.js │ │ └── projectList.js │ ├── webhooks │ │ └── payouts │ │ │ └── index.ts │ ├── language │ │ ├── index.js │ │ ├── projectProgrammingLanguage.js │ │ └── languageSearch.js │ ├── offers │ │ ├── index.js │ │ ├── updateOffer.js │ │ └── offerExists.js │ ├── payouts │ │ ├── index.js │ │ └── payoutSearch.js │ ├── wallets │ │ ├── index.js │ │ ├── walletList.js │ │ └── walletBuilds.js │ ├── paymentRequests │ │ ├── index.js │ │ └── paymentRequestList.js │ ├── mail │ │ ├── handleResponse.js │ │ └── handleError.js │ ├── paymentRequestsTransfers │ │ ├── paymentRequestsTransfersBuilds.js │ │ ├── paymentRequestsTransfersUpdate.js │ │ └── paymentRequestsTransferList.js │ ├── shared │ │ └── stripe │ │ │ └── stripe.js │ ├── transfers │ │ └── index.js │ ├── users │ │ ├── userFetch.js │ │ └── userAccountBalance.js │ ├── walletOrders │ │ ├── index.js │ │ └── walletOrderList.js │ ├── organizations │ │ ├── index.js │ │ └── organizationBuilds.js │ ├── tasks │ │ ├── taskExists.js │ │ ├── taskMessageAuthor.js │ │ └── taskSolutionGet.js │ └── orders │ │ ├── orderExists.js │ │ └── orderFetch.js ├── index.ts ├── models │ ├── role.js │ ├── planSchema.js │ ├── type.js │ ├── assign.js │ ├── label.js │ ├── member.js │ ├── coupon.js │ └── projectProgrammingLanguage.js ├── app │ ├── routes │ │ ├── contact.js │ │ ├── team.js │ │ ├── dashboard.ts │ │ ├── types.js │ │ ├── label.js │ │ ├── info.js │ │ ├── paymentRequestBalance.ts │ │ ├── paymentRequestPayment.ts │ │ ├── projects.js │ │ ├── offer.js │ │ ├── coupon.js │ │ ├── language.js │ │ ├── payout.js │ │ ├── transfer.js │ │ ├── paymentRequest.js │ │ ├── wallet.js │ │ ├── walletOrder.js │ │ ├── taskSolutions.js │ │ ├── webhooks.js │ │ └── organization.js │ └── controllers │ │ ├── coupon.js │ │ ├── type.js │ │ ├── offer.js │ │ ├── user │ │ └── user.ts │ │ ├── contact.js │ │ ├── team.js │ │ ├── label.js │ │ ├── payment-request-balance.ts │ │ └── payment-request-payment.ts ├── db │ └── migrations │ │ ├── 20180306212049-users.js │ │ ├── 20190118000202-add-os-to-users.js │ │ ├── 20180314205257-add-repos-to-user.js │ │ ├── 20180626131108-add-title-to-task.js │ │ ├── 20180703190806-add-token-to-order.js │ │ ├── 20190118000224-add-skills-to-user.js │ │ ├── 20180314193229-add-website-to-user.js │ │ ├── 20180930181704-add-country-to-user.js │ │ ├── 20210122093719-add-prviate-to-task.js │ │ ├── 20180314204119-add-username-to-user.js │ │ ├── 20180318174217-add-provider-to-user.js │ │ ├── 20180524213355-add-account-to-user.js │ │ ├── 20180701191416-add-provider-to-order.js │ │ ├── 20180703154147-add-payer-id-to-order.js │ │ ├── 20180707141413-add-paypal-to-user.js │ │ ├── 20180930180435-add-language-to-user.js │ │ ├── 20190116200530-add-mailflag-to-task.js │ │ ├── 20190118000217-add-languages-to-user.js │ │ ├── 20190328210733-add-status-to-assigns.js │ │ ├── 20200422012929-add-message-to-assign.js │ │ ├── 20180314210833-add-picture-url-to-user.js │ │ ├── 20180511130542-add-customer-to-user.js │ │ ├── 20180610112853-add-transfer-to-task.js │ │ ├── 20180626132835-add-repourl-to-user.js │ │ ├── 20180707140456-add-transfer-to-order.js │ │ ├── 20210202164305-add-description-to-task.js │ │ ├── 20180703154101-add-payment-url-to-order.js │ │ ├── 20190424115813-add-open-for-jobs-to-users.js │ │ ├── 20200707091140-add-transfer_group-to-order.js │ │ ├── 20200822085416-addProviderUsernameToUser.js │ │ ├── 20191015182526-add-authorization-id-to-order.js │ │ ├── 20190118000232-add-receive-notifications-to-user.js │ │ ├── 20220404015828-add-active-to-user.js │ │ ├── 20180606135249-add-assigned-to-task.js │ │ ├── 20210405203758-change-order-source-not-unique.js │ │ ├── 20201217203513-add-projectId-to-task.js │ │ ├── 20210605214301-add-coupon-to-order.js │ │ ├── 20220412120201-change-offer-comment-char-limit.js │ │ ├── 20201218194527-add-organizationId-to-project.js │ │ ├── 20251211223254-add-arrival-date-to-payout.ts │ │ └── 20251211232235-add-reference-number-to-payout.ts └── config │ └── config.json ├── .prettierrc ├── .eslintignore ├── playwright.config.js ├── .editorconfig ├── playwright └── example.spec.js ├── .travis.yml ├── .sequelizerc ├── .github └── ISSUE_TEMPLATE │ └── config.yml ├── crowdin.yml ├── docker-compose.test.yml ├── tsconfig.json ├── pmd.xml └── .devcontainer ├── devcontainer.json └── docker-compose.yml /.nvmrc: -------------------------------------------------------------------------------- 1 | v18.20.8 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: npm start 2 | -------------------------------------------------------------------------------- /test/bootstrap.cjs: -------------------------------------------------------------------------------- 1 | require('tsx/cjs'); -------------------------------------------------------------------------------- /frontend/.mocharc.yaml: -------------------------------------------------------------------------------- 1 | require: '@babel/register' 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "vsicons.presets.angular": true 3 | } 4 | -------------------------------------------------------------------------------- /frontend/tests/components/__mocks__/fileMock.js: -------------------------------------------------------------------------------- 1 | module.exports = '' 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | build 4 | coverage 5 | *.log 6 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/projects/project-issue-table.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/paypal-info-form/paypal-info-form.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/modules/paymentRequestBalance/index.ts: -------------------------------------------------------------------------------- 1 | export * from './paymentRequestBalanceList' 2 | -------------------------------------------------------------------------------- /src/modules/paymentRequestPayments/index.ts: -------------------------------------------------------------------------------- 1 | export * from './paymentRequestPaymentList' 2 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/billing-info-card/billing-info-card.stories.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/images/bounty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/bounty.png -------------------------------------------------------------------------------- /frontend/src/images/brazil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/brazil.png -------------------------------------------------------------------------------- /frontend/src/images/deal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/deal.png -------------------------------------------------------------------------------- /frontend/src/images/funds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/funds.png -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/layouts/page-layouts/issue-page-layout/issue-page-layout.styles.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/images/Fallback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/Fallback.png -------------------------------------------------------------------------------- /frontend/src/images/login_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/login_bg.png -------------------------------------------------------------------------------- /frontend/src/images/octodex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/octodex.png -------------------------------------------------------------------------------- /frontend/src/images/sharing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/sharing.png -------------------------------------------------------------------------------- /frontend/src/images/welcome1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome1.png -------------------------------------------------------------------------------- /frontend/src/images/welcome2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome2.png -------------------------------------------------------------------------------- /frontend/src/images/welcome3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome3.png -------------------------------------------------------------------------------- /frontend/public/favicon-gitpay.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/favicon-gitpay.ico -------------------------------------------------------------------------------- /frontend/src/images/discount-99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/discount-99.png -------------------------------------------------------------------------------- /frontend/src/images/github-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/github-logo.png -------------------------------------------------------------------------------- /frontend/src/images/gitlab-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/gitlab-logo.png -------------------------------------------------------------------------------- /frontend/src/images/gitpay-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/gitpay-app.png -------------------------------------------------------------------------------- /frontend/src/images/gitpay-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/gitpay-logo.png -------------------------------------------------------------------------------- /frontend/src/images/logo-symbol.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/logo-symbol.png -------------------------------------------------------------------------------- /frontend/src/images/paypal-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/paypal-icon.png -------------------------------------------------------------------------------- /frontend/src/images/slack-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/slack-logo.png -------------------------------------------------------------------------------- /frontend/src/images/task-cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/task-cover.png -------------------------------------------------------------------------------- /frontend/src/images/task-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/task-icon.png -------------------------------------------------------------------------------- /frontend/src/images/time-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/time-icon.png -------------------------------------------------------------------------------- /frontend/src/images/tools-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/tools-icon.png -------------------------------------------------------------------------------- /frontend/src/images/welcome-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome-bg.png -------------------------------------------------------------------------------- /frontend/public/lottie/mission.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/lottie/mission.lottie -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/public-pages/session-public-pages/account-activation/account-activation.stories.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/images/city-software.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/city-software.png -------------------------------------------------------------------------------- /frontend/src/images/logo-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/logo-complete.png -------------------------------------------------------------------------------- /frontend/src/images/notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/notifications.png -------------------------------------------------------------------------------- /frontend/src/images/payment-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/payment-icon.png -------------------------------------------------------------------------------- /src/modules/label/index.js: -------------------------------------------------------------------------------- 1 | const labelSearch = require('./labelSearch') 2 | 3 | module.exports = { 4 | labelSearch 5 | } 6 | -------------------------------------------------------------------------------- /src/modules/roles/index.js: -------------------------------------------------------------------------------- 1 | const roleExists = require('./roleExists') 2 | 3 | module.exports = { 4 | roleExists 5 | } 6 | -------------------------------------------------------------------------------- /frontend/public/lottie/coworking.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/lottie/coworking.lottie -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/drawers/actions/payments/issue-order-details-action/issue-order-details.styles.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/images/avatar-alexandre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/avatar-alexandre.png -------------------------------------------------------------------------------- /frontend/src/images/bitbucket-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/bitbucket-logo.png -------------------------------------------------------------------------------- /frontend/src/images/clients/client1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/client1.png -------------------------------------------------------------------------------- /frontend/src/images/clients/client2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/client2.png -------------------------------------------------------------------------------- /frontend/src/images/clients/client3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/client3.png -------------------------------------------------------------------------------- /frontend/src/images/countries/belize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/belize.png -------------------------------------------------------------------------------- /frontend/src/images/countries/brazil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/brazil.png -------------------------------------------------------------------------------- /frontend/src/images/countries/canada.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/canada.png -------------------------------------------------------------------------------- /frontend/src/images/countries/cyprus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/cyprus.png -------------------------------------------------------------------------------- /frontend/src/images/countries/france.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/france.png -------------------------------------------------------------------------------- /frontend/src/images/countries/ghana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/ghana.png -------------------------------------------------------------------------------- /frontend/src/images/countries/greece.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/greece.png -------------------------------------------------------------------------------- /frontend/src/images/countries/india.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/india.png -------------------------------------------------------------------------------- /frontend/src/images/countries/italy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/italy.png -------------------------------------------------------------------------------- /frontend/src/images/countries/japan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/japan.png -------------------------------------------------------------------------------- /frontend/src/images/countries/jordan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/jordan.png -------------------------------------------------------------------------------- /frontend/src/images/countries/kenya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/kenya.png -------------------------------------------------------------------------------- /frontend/src/images/countries/latvia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/latvia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/malta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/malta.png -------------------------------------------------------------------------------- /frontend/src/images/countries/mexico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/mexico.png -------------------------------------------------------------------------------- /frontend/src/images/countries/norway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/norway.png -------------------------------------------------------------------------------- /frontend/src/images/countries/poland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/poland.png -------------------------------------------------------------------------------- /frontend/src/images/countries/spain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/spain.png -------------------------------------------------------------------------------- /frontend/src/images/countries/sweden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/sweden.png -------------------------------------------------------------------------------- /frontend/src/images/countries/turkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/turkey.png -------------------------------------------------------------------------------- /frontend/src/images/credit-card-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/credit-card-icon.png -------------------------------------------------------------------------------- /frontend/src/images/payment-icon-alt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/payment-icon-alt.png -------------------------------------------------------------------------------- /frontend/src/images/teams/profile_rq.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/teams/profile_rq.jpg -------------------------------------------------------------------------------- /frontend/src/images/welcome-teamwork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome-teamwork.png -------------------------------------------------------------------------------- /frontend/src/images/worknenjoy-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/worknenjoy-logo.png -------------------------------------------------------------------------------- /src/modules/assigns/index.js: -------------------------------------------------------------------------------- 1 | const assignExists = require('./assignExists') 2 | 3 | module.exports = { 4 | assignExists 5 | } 6 | -------------------------------------------------------------------------------- /src/modules/members/index.js: -------------------------------------------------------------------------------- 1 | const memberExists = require('./memberExists') 2 | 3 | module.exports = { 4 | memberExists 5 | } 6 | -------------------------------------------------------------------------------- /frontend/public/lottie/how-it-works.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/lottie/how-it-works.lottie -------------------------------------------------------------------------------- /frontend/public/lottie/startup-life.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/lottie/startup-life.lottie -------------------------------------------------------------------------------- /frontend/src/images/countries/albania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/albania.png -------------------------------------------------------------------------------- /frontend/src/images/countries/austria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/austria.png -------------------------------------------------------------------------------- /frontend/src/images/countries/belgium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/belgium.png -------------------------------------------------------------------------------- /frontend/src/images/countries/bulgaria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/bulgaria.png -------------------------------------------------------------------------------- /frontend/src/images/countries/colombia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/colombia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/croatia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/croatia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/default.png -------------------------------------------------------------------------------- /frontend/src/images/countries/denmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/denmark.png -------------------------------------------------------------------------------- /frontend/src/images/countries/estonia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/estonia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/finland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/finland.png -------------------------------------------------------------------------------- /frontend/src/images/countries/germany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/germany.png -------------------------------------------------------------------------------- /frontend/src/images/countries/hungary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/hungary.png -------------------------------------------------------------------------------- /frontend/src/images/countries/ireland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/ireland.png -------------------------------------------------------------------------------- /frontend/src/images/countries/malaysia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/malaysia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/nigeria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/nigeria.png -------------------------------------------------------------------------------- /frontend/src/images/countries/pakistan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/pakistan.png -------------------------------------------------------------------------------- /frontend/src/images/countries/portugal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/portugal.png -------------------------------------------------------------------------------- /frontend/src/images/countries/romania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/romania.png -------------------------------------------------------------------------------- /frontend/src/images/countries/slovakia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/slovakia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/slovenia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/slovenia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/thailand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/thailand.png -------------------------------------------------------------------------------- /frontend/src/images/github-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/github-logo-black.png -------------------------------------------------------------------------------- /frontend/src/images/github-logo-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/github-logo-bottom.png -------------------------------------------------------------------------------- /frontend/src/images/gitpay-logo-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/gitpay-logo-small.png -------------------------------------------------------------------------------- /frontend/src/images/landingPage_People.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/landingPage_People.png -------------------------------------------------------------------------------- /frontend/src/images/logo-complete-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/logo-complete-gray.png -------------------------------------------------------------------------------- /frontend/src/images/logo-symbol-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/logo-symbol-small.png -------------------------------------------------------------------------------- /frontend/src/images/main-background01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background01.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background02.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background03.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background04.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background05.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background06.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background07.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background08.jpg -------------------------------------------------------------------------------- /frontend/src/images/main-background09.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/main-background09.jpg -------------------------------------------------------------------------------- /frontend/src/images/welcome-companies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome-companies.png -------------------------------------------------------------------------------- /frontend/src/images/welcome-freelancer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/welcome-freelancer.png -------------------------------------------------------------------------------- /src/modules/coupon/index.js: -------------------------------------------------------------------------------- 1 | const validateCoupon = require('./validateCoupon') 2 | 3 | module.exports = { 4 | validateCoupon 5 | } 6 | -------------------------------------------------------------------------------- /src/modules/types/index.js: -------------------------------------------------------------------------------- 1 | const typeSearch = require('./typeSearch') 2 | 3 | module.exports = { 4 | typeSearch: typeSearch 5 | } 6 | -------------------------------------------------------------------------------- /frontend/public/lottie/developer-main.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/lottie/developer-main.lottie -------------------------------------------------------------------------------- /frontend/public/lottie/developer-team.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/public/lottie/developer-team.lottie -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/status-field/status-field.stories.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/src/images/bitbucket-logo-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/bitbucket-logo-blue.png -------------------------------------------------------------------------------- /frontend/src/images/clients/electron-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/electron-logo.png -------------------------------------------------------------------------------- /frontend/src/images/clients/etherpad-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/etherpad-logo.png -------------------------------------------------------------------------------- /frontend/src/images/core-team-page-asset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/core-team-page-asset.png -------------------------------------------------------------------------------- /frontend/src/images/countries/australia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/australia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/bangladesh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/bangladesh.png -------------------------------------------------------------------------------- /frontend/src/images/countries/gibraltar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/gibraltar.png -------------------------------------------------------------------------------- /frontend/src/images/countries/hong-kong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/hong-kong.png -------------------------------------------------------------------------------- /frontend/src/images/countries/indonesia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/indonesia.png -------------------------------------------------------------------------------- /frontend/src/images/countries/lithuania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/lithuania.png -------------------------------------------------------------------------------- /frontend/src/images/countries/luxembourg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/luxembourg.png -------------------------------------------------------------------------------- /frontend/src/images/countries/netherlands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/netherlands.png -------------------------------------------------------------------------------- /frontend/src/images/countries/new-zealand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/new-zealand.png -------------------------------------------------------------------------------- /frontend/src/images/countries/philippine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/philippine.png -------------------------------------------------------------------------------- /frontend/src/images/countries/puerto-rico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/puerto-rico.png -------------------------------------------------------------------------------- /frontend/src/images/countries/singapore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/singapore.png -------------------------------------------------------------------------------- /frontend/src/images/countries/sri-lanka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/sri-lanka.png -------------------------------------------------------------------------------- /frontend/src/images/countries/switzerland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/switzerland.png -------------------------------------------------------------------------------- /frontend/src/images/teams/core-team-mayna.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/teams/core-team-mayna.jpg -------------------------------------------------------------------------------- /frontend/src/images/backgrounds/bg-mail-top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/backgrounds/bg-mail-top.png -------------------------------------------------------------------------------- /frontend/src/images/countries/liechtenstein.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/liechtenstein.png -------------------------------------------------------------------------------- /frontend/src/images/countries/south-africa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/south-africa.png -------------------------------------------------------------------------------- /frontend/src/images/github-logo-alternative.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/github-logo-alternative.png -------------------------------------------------------------------------------- /frontend/src/images/octodex-professortocat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/octodex-professortocat.png -------------------------------------------------------------------------------- /src/modules/contact/index.js: -------------------------------------------------------------------------------- 1 | const contactRecruiters = require('./contactRecruiters') 2 | 3 | module.exports = { 4 | contactRecruiters 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/images/clients/fitnowbrazil-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/fitnowbrazil-logo.png -------------------------------------------------------------------------------- /frontend/src/images/clients/sitespeedio-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/clients/sitespeedio-logo.png -------------------------------------------------------------------------------- /frontend/src/images/countries/czech-republic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/czech-republic.png -------------------------------------------------------------------------------- /frontend/src/images/countries/united-kingdom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/united-kingdom.png -------------------------------------------------------------------------------- /frontend/src/images/material-ui-icon-language.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/material-ui-icon-language.png -------------------------------------------------------------------------------- /frontend/src/images/octodex-motherhubbertocat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/octodex-motherhubbertocat.png -------------------------------------------------------------------------------- /frontend/src/images/teams/wharley-team-member.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/teams/wharley-team-member.jpg -------------------------------------------------------------------------------- /frontend/src/images/united-states-of-america.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/united-states-of-america.png -------------------------------------------------------------------------------- /src/modules/team/index.js: -------------------------------------------------------------------------------- 1 | const requestJoinCoreTeam = require('./requestJoinCoreTeam') 2 | 3 | module.exports = { 4 | requestJoinCoreTeam 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/types/card.ts: -------------------------------------------------------------------------------- 1 | export type CardProps = { 2 | title: string | React.ReactNode 3 | amount: number 4 | type: 'decimal' | 'centavos' 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/images/countries/united-arab-emirates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/united-arab-emirates.png -------------------------------------------------------------------------------- /frontend/src/images/gitpay-explore-task-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/gitpay-explore-task-screenshot.png -------------------------------------------------------------------------------- /frontend/src/images/teams/headhunter-team-member1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/teams/headhunter-team-member1.png -------------------------------------------------------------------------------- /frontend/src/images/teams/headhunter-team-member2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/teams/headhunter-team-member2.png -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import app from './server' 2 | 3 | app.listen(app.get('port'), () => { 4 | console.log('Node app is running on port', app.get('port')) 5 | }) 6 | -------------------------------------------------------------------------------- /frontend/src/common/selectors/user/getUser.js: -------------------------------------------------------------------------------- 1 | export const getUserData = (state) => state.loggedIn.data 2 | export const getCurrentUser = (state) => state.loggedIn 3 | -------------------------------------------------------------------------------- /frontend/src/images/collections/collection-flat-build.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/collections/collection-flat-build.png -------------------------------------------------------------------------------- /frontend/src/common/operator/if.js: -------------------------------------------------------------------------------- 1 | export default (props) => { 2 | if (props.test) { 3 | return props.children 4 | } else { 5 | return false 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/images/countries/united-states-of-america.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/countries/united-states-of-america.png -------------------------------------------------------------------------------- /frontend/src/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.png' 2 | declare module '*.jpg' 3 | declare module '*.svg' { 4 | const content: string 5 | export default content 6 | } 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "none", 4 | "semi": false, 5 | "printWidth": 100, 6 | "tabWidth": 2, 7 | "arrowParens": "always" 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/images/octodex-motherhubbertocat-transparent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/worknenjoy/gitpay/HEAD/frontend/src/images/octodex-motherhubbertocat-transparent.png -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | public 2 | build 3 | node_modules 4 | temp 5 | coverage 6 | test 7 | migrate.js 8 | migration 9 | frontend/stripe-v3.js 10 | frontend/sitemap-builder.js 11 | 12 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | 4 | import App from './main/app' 5 | 6 | ReactDOM.render(, document.getElementById('app')) 7 | -------------------------------------------------------------------------------- /test/data/github/github.auth.token.js: -------------------------------------------------------------------------------- 1 | module.exports.token = { 2 | access_token: 'e72e16c7e42f292c6912e7710c838347ae178b4a', 3 | scope: 'repo,gist', 4 | token_type: 'bearer' 5 | } 6 | -------------------------------------------------------------------------------- /playwright.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('@playwright/test') 2 | 3 | module.exports = defineConfig({ 4 | testDir: './playwright', 5 | use: { 6 | headless: true 7 | } 8 | }) 9 | -------------------------------------------------------------------------------- /src/modules/projects/index.js: -------------------------------------------------------------------------------- 1 | const projectFetch = require('./projectFetch') 2 | const projectList = require('./projectList') 3 | 4 | module.exports = { 5 | projectFetch, 6 | projectList 7 | } 8 | -------------------------------------------------------------------------------- /src/models/role.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const Role = sequelize.define('Role', { 3 | name: DataTypes.STRING, 4 | label: DataTypes.STRING 5 | }) 6 | 7 | return Role 8 | } 9 | -------------------------------------------------------------------------------- /src/modules/webhooks/payouts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './payoutCreated/payoutCreated' 2 | export * from './payoutUpdated/payoutUpdated' 3 | export * from './payoutFailed/payoutFailed' 4 | export * from './payoutPaid/payoutPaid' 5 | -------------------------------------------------------------------------------- /src/modules/language/index.js: -------------------------------------------------------------------------------- 1 | const languageSearch = require('./languageSearch') 2 | const projectlanguageSearch = require('./projectProgrammingLanguage') 3 | 4 | module.exports = { 5 | languageSearch, 6 | projectlanguageSearch 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/containers/home.js: -------------------------------------------------------------------------------- 1 | import Home from '../components/areas/public/features/welcome/pages/home-page' 2 | 3 | import CommonContainer from './common' 4 | 5 | const HomeContainer = CommonContainer(Home) 6 | 7 | export default HomeContainer 8 | -------------------------------------------------------------------------------- /frontend/src/main/authOrApp.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react' 2 | 3 | import App from './app' 4 | 5 | class AuthOrApp extends Component { 6 | render() { 7 | return 8 | } 9 | } 10 | 11 | export default AuthOrApp 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/transitions/transition.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Slide from '@mui/material/Slide' 3 | 4 | const Transition = (props) => 5 | 6 | export default Transition 7 | -------------------------------------------------------------------------------- /src/app/routes/contact.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controllers = require('../controllers/contact') 4 | 5 | router.post('/recruiters', controllers.contactRecruiters) 6 | 7 | module.exports = router 8 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/lists/requirements-list/requirement-list.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Root = styled('div')(({ theme }) => ({ 4 | width: '100%', 5 | maxWidth: 500 6 | })) 7 | -------------------------------------------------------------------------------- /frontend/src/containers/public-container.js: -------------------------------------------------------------------------------- 1 | import CommonContainer from './common' 2 | import PublicPage from '../components/areas/public/pages/public-page' 3 | 4 | const PublicContainer = CommonContainer(PublicPage) 5 | 6 | export default PublicContainer 7 | -------------------------------------------------------------------------------- /src/app/routes/team.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controllers = require('../controllers/team') 4 | 5 | router.post('/core/join', controllers.requestJoinCoreTeamController) 6 | 7 | module.exports = router 8 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/dialogs/issue-invite-dialog/issue-invite-dialog.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Container = styled('div')` 4 | display: inline-block; 5 | margin-right: 1rem; 6 | ` 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/public-pages/issue-public-page/issue-public-page.styles.tsx: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | // Root wrapper 4 | export const Root = styled('div')(() => ({ 5 | flexGrow: 1, 6 | marginTop: 0 7 | })) 8 | -------------------------------------------------------------------------------- /frontend/src/containers/welcome.js: -------------------------------------------------------------------------------- 1 | import Welcome from '../components/areas/public/features/welcome/pages/welcome-page' 2 | 3 | import CommonContainer from './common' 4 | 5 | const WelcomeContainer = CommonContainer(Welcome) 6 | 7 | export default WelcomeContainer 8 | -------------------------------------------------------------------------------- /src/modules/contact/contactRecruiters.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const ContactMail = require('../mail/contact') 3 | 4 | module.exports = Promise.method(function contactRecruiters(contactParams) { 5 | return ContactMail.recruiters(contactParams) 6 | }) 7 | -------------------------------------------------------------------------------- /src/modules/offers/index.js: -------------------------------------------------------------------------------- 1 | const offerExists = require('./offerExists') 2 | const offerMessage = require('./offerMessage') 3 | const updateOffer = require('./updateOffer') 4 | 5 | module.exports = { 6 | offerExists, 7 | offerMessage, 8 | updateOffer 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/import-issue-button/import-issue-button.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | export const Container = styled('div')(() => ({ 3 | // reserved for future styles 4 | })) 5 | export default { Container } 6 | -------------------------------------------------------------------------------- /src/modules/payouts/index.js: -------------------------------------------------------------------------------- 1 | const payoutBuilds = require('./payoutBuilds') 2 | const payoutRequest = require('./payoutRequest') 3 | const payoutSearch = require('./payoutSearch') 4 | 5 | module.exports = { 6 | payoutBuilds, 7 | payoutRequest, 8 | payoutSearch 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/welcome/pages/home-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Home from 'design-library/pages/public-pages/home-public-page/home-public-page' 3 | 4 | const HomePage = () => { 5 | return 6 | } 7 | 8 | export default HomePage 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/bank-account-forms/bank-account-form/bank-account-form.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Placeholder = styled('div')(() => ({ 4 | margin: 10 5 | })) 6 | 7 | export default { Placeholder } 8 | -------------------------------------------------------------------------------- /frontend/src/utils/valid-account.tsx: -------------------------------------------------------------------------------- 1 | export const validAccount = (user, account) => { 2 | if (!user?.account_id) { 3 | return false 4 | } else if (account?.data?.requirements?.currently_due?.length > 0) { 5 | return false 6 | } else { 7 | return true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/app/routes/dashboard.ts: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import { getUserInfo } from '../controllers/user/user' 3 | import secure from './secure' 4 | 5 | const router = express.Router() 6 | 7 | router.use(secure) 8 | router.get('/', getUserInfo) 9 | 10 | export default router 11 | -------------------------------------------------------------------------------- /frontend/src/actions/helpers/index.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import Auth from '../../modules/auth' 3 | 4 | export const validToken = () => { 5 | if (Auth.getToken()) { 6 | axios.defaults.headers.common['authorization'] = Auth.getToken() 7 | } 8 | 9 | return true 10 | } 11 | -------------------------------------------------------------------------------- /playwright/example.spec.js: -------------------------------------------------------------------------------- 1 | const { test, expect } = require('@playwright/test') 2 | 3 | test('basic check', async ({ page }) => { 4 | await page.goto('data:text/html,

Hello Playwright

') 5 | await expect(page.locator('h1')).toHaveText('Hello Playwright') 6 | }) 7 | -------------------------------------------------------------------------------- /src/app/routes/types.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/type') 5 | 6 | router.get('/search', controllers.typeSearchController) 7 | 8 | module.exports = router 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fields/field/field.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { FormControl as MuiFormControl } from '@mui/material' 3 | 4 | export const RootFormControl = styled(MuiFormControl)(({ theme }) => ({ 5 | width: '100%' 6 | })) 7 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/issue-cards/issue-invite-card/issue-invite-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { Card } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const Root = styled(Card)(() => ({ 5 | marginBottom: 20, 6 | marginTop: 20 7 | })) 8 | -------------------------------------------------------------------------------- /src/app/routes/label.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/label') 5 | 6 | router.get('/search', controllers.labelSearchController) 7 | 8 | module.exports = router 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | dist: trusty 3 | language: node_js 4 | cache: 5 | directories: 6 | - node_modules 7 | services: 8 | - postgresql 9 | before_script: 10 | - psql -c 'create database gitpay_test;' -U postgres 11 | - npm run migrate-test 12 | node_js: 13 | - "8.6.0" 14 | 15 | -------------------------------------------------------------------------------- /src/db/migrations/20180306212049-users.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'name', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'name') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.sequelizerc: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | 'config': path.resolve('src', 'config', 'config.json'), 5 | 'migrations-path': path.resolve('src', 'db', 'migrations'), 6 | 'seeders-path': path.resolve('src', 'db', 'seeders'), 7 | 'models-path': path.resolve('src', 'models') 8 | } -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/welcome/pages/welcome-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import About from 'design-library/pages/public-pages/about-public-page/about-public-page' 3 | 4 | const WelcomePage = (props) => { 5 | return 6 | } 7 | 8 | export default WelcomePage 9 | -------------------------------------------------------------------------------- /src/db/migrations/20190118000202-add-os-to-users.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'os', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'os') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/payment-cards/wallet-payment-card/wallet-payment-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { Button } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const BtnPayment = styled(Button)(() => ({ 5 | float: 'right', 6 | marginTop: 10 7 | })) 8 | -------------------------------------------------------------------------------- /frontend/src/utils/format-currency.tsx: -------------------------------------------------------------------------------- 1 | export const formatCurrency = ( 2 | amount: number | bigint, 3 | locale: string = 'en-US', 4 | currency: string = 'USD' 5 | ) => { 6 | return new Intl.NumberFormat(locale, { 7 | style: 'currency', 8 | currency: currency 9 | }).format(amount) 10 | } 11 | -------------------------------------------------------------------------------- /src/app/routes/info.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../models') 4 | require('../../modules/authenticationHelpers') 5 | const controllers = require('../controllers/info') 6 | 7 | router.get('/all', controllers.info) 8 | 9 | module.exports = router 10 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/pricing/pages/pricing-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PricingPublicPage from 'design-library/pages/public-pages/pricing-public-page/pricing-public-page' 3 | 4 | const PricingPage = () => { 5 | return 6 | } 7 | export default PricingPage 8 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/button/button.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import CircularProgress from '@mui/material/CircularProgress' 3 | 4 | export const Progress = styled(CircularProgress)(() => ({ 5 | marginLeft: 10 6 | })) 7 | 8 | export default { Progress } 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/payout-forms/payout-request-form/payout-request-form.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | // Wrapper for the currency end-adornment 4 | export const EndAdornment = styled('div')(({ theme }) => ({ 5 | marginLeft: theme.spacing(1) 6 | })) 7 | -------------------------------------------------------------------------------- /src/db/migrations/20180314205257-add-repos-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'repos', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'repos') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180626131108-add-title-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'title', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Tasks', 'title') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180703190806-add-token-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'token', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'token') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20190118000224-add-skills-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'skills', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'skills') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180314193229-add-website-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'website', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'website') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180930181704-add-country-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'country', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'country') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20210122093719-add-prviate-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'private', Sequelize.BOOLEAN) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Tasks', 'private') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Gitpay Discussions 4 | url: https://github.com/worknenjoy/gitpay/discussions 5 | about: Please ask and answer questions here. 6 | - name: Gipay website 7 | url: https://gitpay.me 8 | about: See the platform in production 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/templates/base/public-base/public-base.styles.ts: -------------------------------------------------------------------------------- 1 | import { Container } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const RootContainer = styled(Container)(({ theme }) => ({ 5 | marginBottom: theme.spacing(6), 6 | marginTop: theme.spacing(6) 7 | })) 8 | -------------------------------------------------------------------------------- /src/db/migrations/20180314204119-add-username-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'username', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'username') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180318174217-add-provider-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'provider', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'provider') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180524213355-add-account-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'account_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'account_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180701191416-add-provider-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'provider', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'provider') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180703154147-add-payer-id-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'payer_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'payer_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180707141413-add-paypal-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'paypal_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'paypal_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180930180435-add-language-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'language', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'language') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20190116200530-add-mailflag-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'notified', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Tasks', 'notified') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20190118000217-add-languages-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'languages', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'languages') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20190328210733-add-status-to-assigns.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Assigns', 'status', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Assigns', 'status') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20200422012929-add-message-to-assign.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Assigns', 'message', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Assigns', 'message') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180314210833-add-picture-url-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'picture_url', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'picture_url') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180511130542-add-customer-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'customer_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'customer_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180610112853-add-transfer-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'transfer_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Tasks', 'transfer_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180626132835-add-repourl-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'profile_url', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'profile_url') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20180707140456-add-transfer-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'transfer_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'transfer_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20210202164305-add-description-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'description', Sequelize.TEXT) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Tasks', 'description') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/models/planSchema.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const PlanSchema = sequelize.define('PlanSchema', { 3 | name: DataTypes.STRING, 4 | description: DataTypes.STRING, 5 | fee: DataTypes.DECIMAL, 6 | feeType: DataTypes.ENUM('charge', 'refund') 7 | }) 8 | 9 | return PlanSchema 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/alerts/account-requirements/account-requirements.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { CustomAlert as Alert } from '../alert/alert' 3 | 4 | export const CustomAlert = styled(Alert)({ 5 | marginBottom: 20, 6 | display: 'flex', 7 | alignItems: 'center' 8 | }) 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/price-forms/price-plan-form/price-plan-form.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Grid } from '@mui/material' 3 | 4 | // Styled container for the price plan form 5 | export const PlanGrid = styled(Grid)(({ theme }) => ({ 6 | alignItems: 'center' 7 | })) 8 | -------------------------------------------------------------------------------- /src/db/migrations/20180703154101-add-payment-url-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'payment_url', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'payment_url') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20190424115813-add-open-for-jobs-to-users.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'openForJobs', Sequelize.BOOLEAN) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'openForJobs') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/modules/wallets/index.js: -------------------------------------------------------------------------------- 1 | const walletBuilds = require('./walletBuilds') 2 | const walletUpdate = require('./walletUpdate') 3 | const walletList = require('./walletList') 4 | const walletFetch = require('./walletFetch') 5 | 6 | module.exports = { 7 | walletBuilds, 8 | walletUpdate, 9 | walletList, 10 | walletFetch 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/account/features/account-details/account-details.css: -------------------------------------------------------------------------------- 1 | .PhoneInputInput { 2 | height: 52px; 3 | border: 2px solid #E2E5EA; 4 | border-radius: 3px; 5 | padding: 0px 12px; 6 | height: 52; 7 | } 8 | 9 | .PhoneInput.PhoneInput--focus input { 10 | border: 2px solid #353A42 !important; 11 | } -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/team/pages/team.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import TeamPage from '../../../../../design-library/pages/public-pages/team-public-page/team-public-page' 3 | 4 | const Team = ({ joinTeamAPICall }) => { 5 | return 6 | } 7 | 8 | export default Team 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/headers/profile-secondary-header/profile-secondary-header.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Container = styled('div')(({ theme }) => ({ 4 | marginBottom: 20, 5 | display: 'flex', 6 | flexDirection: 'row', 7 | justifyContent: 'space-between' 8 | })) 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/public-pages/user-profile-public-page/user-profile-public-page.styles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const Root = styled(Grid)(({ theme }) => ({ 5 | marginRight: theme.spacing(3), 6 | marginBottom: theme.spacing(3) 7 | })) 8 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/filters/issue-filter/issue-filter.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { MenuItem } from '@mui/material' 3 | 4 | export const MenuItemCustom = styled(MenuItem)(({ theme }) => ({ 5 | display: 'flex', 6 | alignItems: 'center', 7 | justifyContent: 'space-between' 8 | })) 9 | -------------------------------------------------------------------------------- /src/db/migrations/20200707091140-add-transfer_group-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'transfer_group', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'transfer_group') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/db/migrations/20200822085416-addProviderUsernameToUser.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'provider_username', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'provider_username') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/modules/paymentRequests/index.js: -------------------------------------------------------------------------------- 1 | const paymentRequestBuilds = require('./paymentRequestBuilds') 2 | const paymentRequestList = require('./paymentRequestList') 3 | const paymentRequestUpdate = require('./paymentRequestUpdate') 4 | 5 | module.exports = { 6 | paymentRequestBuilds, 7 | paymentRequestList, 8 | paymentRequestUpdate 9 | } 10 | -------------------------------------------------------------------------------- /src/app/routes/paymentRequestBalance.ts: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import secure from './secure' 3 | 4 | const router = express.Router() 5 | 6 | import { listPaymentRequestBalances } from '../controllers/payment-request-balance' 7 | 8 | router.use(secure) 9 | router.get('/', listPaymentRequestBalances) 10 | 11 | export default router 12 | -------------------------------------------------------------------------------- /src/app/routes/paymentRequestPayment.ts: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import secure from './secure' 3 | 4 | const router = express.Router() 5 | 6 | import { listPaymentRequestPayments } from '../controllers/payment-request-payment' 7 | 8 | router.use(secure) 9 | router.get('/', listPaymentRequestPayments) 10 | 11 | export default router 12 | -------------------------------------------------------------------------------- /src/app/routes/projects.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/project') 5 | 6 | router.get('/fetch/:id', controllers.fetchProject) 7 | router.get('/list', controllers.listProjects) 8 | 9 | module.exports = router 10 | -------------------------------------------------------------------------------- /src/db/migrations/20191015182526-add-authorization-id-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Orders', 'authorization_id', Sequelize.STRING) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Orders', 'authorization_id') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/modules/mail/handleResponse.js: -------------------------------------------------------------------------------- 1 | module.exports = (response) => { 2 | // eslint-disable-next-line no-console 3 | console.log(response[0].statusCode) 4 | // eslint-disable-next-line no-console 5 | console.log(response[0].body) 6 | // eslint-disable-next-line no-console 7 | console.log(response[0].headers) 8 | return response 9 | } 10 | -------------------------------------------------------------------------------- /test/data/stripe/stripe.customer.js: -------------------------------------------------------------------------------- 1 | module.exports.customer = { 2 | id: 'cus_QsYn1aSStYv4tf', 3 | object: 'customer', 4 | address: null, 5 | balance: 0, 6 | created: 1615375261, 7 | currency: 'usd', 8 | default_source: null, 9 | delinquent: false, 10 | description: null, 11 | discount: null, 12 | email: 'test@test.com' 13 | } 14 | -------------------------------------------------------------------------------- /src/modules/paymentRequestsTransfers/paymentRequestsTransfersBuilds.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(async function transferBuilds(params) { 5 | const paymentRequestTransfer = await models.PaymentRequestTransfer.create(params) 6 | return paymentRequestTransfer 7 | }) 8 | -------------------------------------------------------------------------------- /src/modules/shared/stripe/stripe.js: -------------------------------------------------------------------------------- 1 | module.exports = () => { 2 | const Stripe = require('stripe') 3 | const passthroughFetch = (...args) => fetch(...args) 4 | 5 | return new Stripe(process.env.STRIPE_KEY, { 6 | httpClient: 7 | process.env.NODE_ENV === 'test' ? Stripe.createFetchHttpClient(passthroughFetch) : undefined 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/drawers/issue-offer-drawer/issue-offer-drawer.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | // Styled wrapper for inline text used inside FormattedMessage render props 4 | export const SpanText = styled('span')(({ theme }) => ({ 5 | display: 'inline-block', 6 | verticalAlign: 'middle' 7 | })) 8 | -------------------------------------------------------------------------------- /src/app/routes/offer.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | 5 | const controllers = require('../controllers/offer') 6 | const secure = require('./secure') 7 | 8 | router.use(secure) 9 | router.put('/:id', controllers.updateOffer) 10 | 11 | module.exports = router 12 | -------------------------------------------------------------------------------- /src/db/migrations/20190118000232-add-receive-notifications-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Users', 'receiveNotifications', Sequelize.BOOLEAN) 4 | }, 5 | 6 | down: (queryInterface, Sequelize) => { 7 | queryInterface.removeColumn('Users', 'receiveNotifications') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/modules/offers/updateOffer.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | 3 | const models = require('../../models') 4 | const AssignMail = require('../mail/assign') 5 | const i18n = require('i18n') 6 | 7 | module.exports = Promise.method(function ({ id }, { status }) { 8 | return models.Offer.update({ status }, { where: { id } }).then((u) => u) 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/loaders/placeholders/avatar-placeholder.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Skeleton } from '@mui/material' 3 | 4 | export const Placeholder = styled(Skeleton)(() => ({ 5 | width: 40, 6 | height: 40, 7 | margin: 10 8 | })) 9 | 10 | export default { 11 | Placeholder 12 | } 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/claims-dashboard-card/claims-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const DashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/payments-dashboard-card/payments-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const DashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/payouts-dashboard-card/payouts-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const DashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/wallets-dashboard-card/wallets-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const DashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/public-pages/explorer-public-page/explorer-public-page/explorer-public-page.styles.ts: -------------------------------------------------------------------------------- 1 | import { Container } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const RootContainer = styled(Container)(({ theme }) => ({ 5 | marginBottom: theme.spacing(6), 6 | marginTop: theme.spacing(6) 7 | })) 8 | -------------------------------------------------------------------------------- /src/app/routes/coupon.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/coupon') 5 | const secure = require('./secure') 6 | 7 | router.use(secure) 8 | 9 | router.post('/validate', controllers.validateCoupon) 10 | 11 | module.exports = router 12 | -------------------------------------------------------------------------------- /src/modules/language/projectProgrammingLanguage.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | const { Op } = require('sequelize') 4 | 5 | module.exports = Promise.method(function projectLanguageSearch(searchParams) { 6 | return models.ProjectProgrammingLanguage.findAll({}).then((data) => { 7 | return data 8 | }) 9 | }) 10 | -------------------------------------------------------------------------------- /src/modules/transfers/index.js: -------------------------------------------------------------------------------- 1 | const transferBuilds = require('./transferBuilds') 2 | const transferSearch = require('./transferSearch') 3 | const transferUpdate = require('./transferUpdate') 4 | const transferFetch = require('./transferFetch') 5 | 6 | module.exports = { 7 | transferBuilds, 8 | transferSearch, 9 | transferUpdate, 10 | transferFetch 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/session/pages/signin-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SigninPageTemplate from 'design-library/pages/public-pages/session-public-pages/signin-page/signin-page' 3 | 4 | const SigninPage = ({ addNotification }) => { 5 | return 6 | } 7 | 8 | export default SigninPage 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/action-field/action-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ActionsMenu from 'design-library/molecules/menus/actions-menu/actions-menu' 3 | 4 | const ActionField = ({ actions }) => { 5 | return 6 | } 7 | 8 | export default ActionField 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/issue/issue-status-field/issue-status-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import IssueStatus from 'design-library/atoms/status/issue-status/issue-status' 3 | 4 | const IssueStatusField = ({ issue }) => 5 | 6 | export default IssueStatusField 7 | -------------------------------------------------------------------------------- /frontend/tests/components/__mocks__/react-intl.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | const Intl = jest.requireActual('react-intl') 3 | 4 | const intl = { 5 | formatMessage: ({ defaultMessage }) => defaultMessage, 6 | defineMessages: (messages) => messages 7 | } 8 | 9 | Intl.injectIntl = (Node) => (props) => 10 | 11 | module.exports = Intl 12 | -------------------------------------------------------------------------------- /src/models/type.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const Type = sequelize.define('Type', { 3 | name: DataTypes.STRING, 4 | label: DataTypes.STRING, 5 | description: DataTypes.STRING 6 | }) 7 | 8 | Type.associate = (models) => { 9 | Type.belongsToMany(models.User, { through: 'User_Types' }) 10 | } 11 | 12 | return Type 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/alerts/alert/alert.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Alert } from '@mui/material' 3 | 4 | export const CustomAlertStyled = styled(Alert)(({ theme }) => ({ 5 | [theme.breakpoints.down('sm')]: { 6 | display: 'flex', 7 | flexDirection: 'column', 8 | alignItems: 'center' 9 | } 10 | })) 11 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/bank-account-dashboard-card/bank-account-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const DashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/my-issues-dashboard-card/my-issue-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const IssueDashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/private-pages/settings-pages/account-settings/account-settings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import AccountTabs from '../../../../molecules/tabs/account-tabs/account-tabs' 3 | 4 | const AccountSettings = ({ user, children }) => { 5 | return {children} 6 | } 7 | 8 | export default AccountSettings 9 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/session/pages/forgot-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ForgotPasswordPage from 'design-library/pages/public-pages/session-public-pages/forgot-password-page/forgot-password-page' 3 | 4 | const ForgotPage = ({ forgotPassword }) => { 5 | return 6 | } 7 | export default ForgotPage 8 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/loaders/loader/loader.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styles from './loader.styles' 3 | 4 | function CustomizedProgress() { 5 | const { Root, Progress } = styles as any 6 | 7 | return ( 8 | 9 | 10 | 11 | ) 12 | } 13 | 14 | export default CustomizedProgress 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/payment-requests-dashboard-card/payment-requests-dashboard-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const DashboardCardChipList = styled('div')({ 4 | display: 'flex', 5 | justifyContent: 'flex-start', 6 | flexWrap: 'wrap', 7 | gap: '8px', 8 | paddingTop: '16px' 9 | }) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/menus/account-menu/account-menu.styles.ts: -------------------------------------------------------------------------------- 1 | import { Avatar } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | import media from '../../../../../styleguide/media' 4 | 5 | export const StyledAvatar = styled(Avatar)` 6 | margin-left: 20px; 7 | cursor: pointer; 8 | 9 | ${media.phone`margin-left: 15px;`} 10 | ` 11 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/private-pages/settings-pages/payout-settings/payout-settings.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PayoutSetingsTabs from '../../../../molecules/tabs/payout-settings-tabs/payout-settings-tabs' 3 | 4 | const PayoutSetings = ({ children }) => { 5 | return {children} 6 | } 7 | 8 | export default PayoutSetings 9 | -------------------------------------------------------------------------------- /src/app/routes/language.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/language') 5 | 6 | router.get('/search', controllers.languageSearchController) 7 | router.get('/task/search', controllers.projectLanguageSearchController) 8 | 9 | module.exports = router 10 | -------------------------------------------------------------------------------- /src/modules/users/userFetch.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | const stripe = require('../shared/stripe/stripe')() 4 | 5 | module.exports = Promise.method(function userFetch(id) { 6 | return models.User.findOne({ 7 | where: { id }, 8 | include: [models.Type] 9 | }).then((data) => { 10 | return data 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/input-comment/input-comment.styles.ts: -------------------------------------------------------------------------------- 1 | import { Theme } from '@mui/material/styles' 2 | 3 | export const getInputCommentStyles = (theme: Theme) => ({ 4 | counter: { 5 | fontFamily: 'Roboto', 6 | color: '#a9a9a9', 7 | marginTop: '10px', 8 | textAlign: 'right' 9 | } 10 | }) 11 | 12 | export default getInputCommentStyles 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-pagination-actions/section-table-pagination-actions.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Root = styled('div')(({ theme }) => ({ 4 | flexShrink: 0, 5 | color: theme.palette.text.secondary, 6 | marginLeft: theme.spacing(2.5) 7 | })) 8 | 9 | export default { Root } 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/loaders/placeholders/avatar-placeholder.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import styles from './avatar-placeholder.styles' 3 | 4 | export const AvatarPlaceholder = () => { 5 | const { Placeholder } = styles as any 6 | return ( 7 |
8 | 9 |
10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/payouts/payout-status-field/payout-status-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PayoutStatus from 'design-library/atoms/status/payout-status/payout-status' 3 | 4 | const PayoutStatusField = ({ status }) => { 5 | return 6 | } 7 | 8 | export default PayoutStatusField 9 | -------------------------------------------------------------------------------- /src/modules/label/labelSearch.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | const { Op } = require('sequelize') 4 | 5 | module.exports = Promise.method(function labelSearch(searchParams) { 6 | return models.Label.findAll({ 7 | where: searchParams || {}, 8 | order: [['name', 'ASC']] 9 | }).then((data) => { 10 | return data 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /src/modules/walletOrders/index.js: -------------------------------------------------------------------------------- 1 | const walletOrderBuilds = require('./walletOrderBuilds') 2 | const walletOrderUpdate = require('./walletOrderUpdate') 3 | const walletOrderList = require('./walletOrderList') 4 | const walletOrderFetch = require('./walletOrderFetch') 5 | 6 | module.exports = { 7 | walletOrderBuilds, 8 | walletOrderUpdate, 9 | walletOrderList, 10 | walletOrderFetch 11 | } 12 | -------------------------------------------------------------------------------- /test/authenticate.sequelize.test.js: -------------------------------------------------------------------------------- 1 | const models = require('../src/models') 2 | 3 | describe('authenticate', () => { 4 | it('should authenticate sequelize', (done) => { 5 | models.sequelize 6 | .authenticate() 7 | .then((err) => { 8 | if (err) done(err) 9 | else done() 10 | }) 11 | .catch((err) => { 12 | done(err) 13 | }) 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /src/modules/users/userAccountBalance.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const stripe = require('../shared/stripe/stripe')() 3 | 4 | module.exports = Promise.method(async function userAccountBalance(userParameters) { 5 | const { account_id } = userParameters 6 | const accountBalance = await stripe.balance.retrieve({ 7 | stripeAccount: account_id 8 | }) 9 | return accountBalance 10 | }) 11 | -------------------------------------------------------------------------------- /src/modules/organizations/index.js: -------------------------------------------------------------------------------- 1 | const organizationList = require('./organizationList') 2 | const organizationBuilds = require('./organizationBuilds') 3 | const organizationUpdate = require('./organizationUpdate') 4 | const organizationFetch = require('./organizationFetch') 5 | 6 | module.exports = { 7 | organizationList, 8 | organizationBuilds, 9 | organizationUpdate, 10 | organizationFetch 11 | } 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/transfer/transfer-status-field/transfer-status-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import TransferStatus from 'design-library/atoms/status/transfer-status/transfer-status' 3 | 4 | const TransferStatusField = ({ status }) => { 5 | return 6 | } 7 | 8 | export default TransferStatusField 9 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/session/pages/account-activation-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import AccountActivation from 'design-library/pages/public-pages/session-public-pages/account-activation/account-activation' 3 | 4 | const AccountActivationPage = ({ activateAccount }) => { 5 | return 6 | } 7 | 8 | export default AccountActivationPage 9 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/session/pages/signup-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SignupPageTemplate from 'design-library/pages/public-pages/session-public-pages/signup-page/signup-page' 3 | 4 | const SignupPage = ({ fetchRoles, registerUser, roles }) => { 5 | return 6 | } 7 | 8 | export default SignupPage 9 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/loaders/loader/loader.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Loader from './loader' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Loaders/Loader', 6 | component: Loader 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if any 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/empty/empty-claim/empty-claim.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import EmptyClaim from './empty-claim' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Empty/EmptyClaim', 6 | component: EmptyClaim 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/text-field/text-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Typography } from '@mui/material' 3 | 4 | const TextField = ({ title }) => { 5 | return ( 6 | 7 | {title} 8 | 9 | ) 10 | } 11 | 12 | export default TextField 13 | -------------------------------------------------------------------------------- /src/db/migrations/20220404015828-add-active-to-user.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: function (queryInterface, Sequelize) { 3 | return queryInterface.addColumn('Users', 'active', { 4 | type: Sequelize.BOOLEAN, 5 | allowNull: false, 6 | defaultValue: true 7 | }) 8 | }, 9 | 10 | down: function (queryInterface, Sequelize) { 11 | queryInterface.removeColumn('Users', 'active') 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/modules/language/languageSearch.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | const { Op } = require('sequelize') 4 | 5 | module.exports = Promise.method(function languageSearch(searchParams) { 6 | return models.ProgrammingLanguage.findAll({ 7 | where: searchParams || {}, 8 | order: [['name', 'ASC']] 9 | }).then((data) => { 10 | return data 11 | }) 12 | }) 13 | -------------------------------------------------------------------------------- /src/modules/payouts/payoutSearch.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(async function payoutSearch(params = {}) { 5 | let payouts = [] 6 | if (params.userId) { 7 | payouts = await models.Payout.findAll({ 8 | where: { userId: params.userId }, 9 | include: [models.User] 10 | }) 11 | } 12 | return payouts 13 | }) 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/empty/empty-payout/empty-payout.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import EmptyPayout from './empty-payout' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Empty/EmptyPayout', 6 | component: EmptyPayout 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/lists/issue-author-list/issue-author-list.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Root = styled('div')(({ theme }) => ({ 4 | flexGrow: 1 5 | })) 6 | 7 | export const MainBlock = styled('div')(({ theme }) => ({ 8 | display: 'flex', 9 | justifyContent: 'center', 10 | alignItems: 'center', 11 | padding: theme.spacing(2) 12 | })) 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/issue/issue-created-field/issue-created-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import CreatedField from '../../base/created-field/created-field' 3 | 4 | const IssueCreatedField = ({ issue }) => { 5 | const { createdAt } = issue 6 | return 7 | } 8 | 9 | export default IssueCreatedField 10 | -------------------------------------------------------------------------------- /src/app/controllers/coupon.js: -------------------------------------------------------------------------------- 1 | const couponValidate = require('../../modules/coupon').validateCoupon 2 | 3 | exports.validateCoupon = (req, res) => { 4 | couponValidate(req.body) 5 | .then((data) => { 6 | res.send(data) 7 | }) 8 | .catch((error) => { 9 | // eslint-disable-next-line no-console 10 | console.log(error) 11 | res.status(400).send({ error: error.message }) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /src/app/controllers/type.js: -------------------------------------------------------------------------------- 1 | const typeSearch = require('../../modules/types').typeSearch 2 | 3 | exports.typeSearchController = (req, res) => { 4 | typeSearch(req.body) 5 | .then((data) => { 6 | res.status(200).send(data) 7 | }) 8 | .catch((error) => { 9 | // eslint-disable-next-line no-console 10 | console.log('error on types', error) 11 | res.status(401).send(error) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/project-card/project-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { Card, Grid } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const RootCard = styled(Card)(({ theme }) => ({ 5 | display: 'flex', 6 | flexDirection: 'column' 7 | })) 8 | 9 | export const StatsItem = styled(Grid)(({ theme }) => ({ 10 | alignItems: 'center', 11 | display: 'flex' 12 | })) 13 | -------------------------------------------------------------------------------- /src/app/controllers/offer.js: -------------------------------------------------------------------------------- 1 | const Offers = require('../../modules/offers') 2 | 3 | // update offer 4 | exports.updateOffer = ({ params, body }, res) => 5 | Offers.updateOffer(params, body) 6 | .then((data) => res.send(data)) 7 | .catch((error) => { 8 | // eslint-disable-next-line no-console 9 | console.log('error on task controller update offer', error) 10 | res.send({ error: error.message }) 11 | }) 12 | -------------------------------------------------------------------------------- /src/app/controllers/user/user.ts: -------------------------------------------------------------------------------- 1 | import userInfo from '../../../modules/users/userInfo' 2 | 3 | export const getUserInfo = async (req: any, res: any) => { 4 | const userId = req.user.id 5 | try { 6 | const info = await userInfo({ userId }) 7 | res.status(200).json(info) 8 | } catch (error) { 9 | console.error('Error fetching user info:', error) 10 | res.status(500).send('Error fetching user info') 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/modules/types/typeSearch.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(function typeSearch(typeParameters) { 5 | return models.Type.findAll({}) 6 | .then((type) => { 7 | return type 8 | }) 9 | .catch((error) => { 10 | // eslint-disable-next-line no-console 11 | console.log(error) 12 | return false 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/organization-card/organization-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { Card, Grid } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const RootCard = styled(Card)(({ theme }) => ({ 5 | display: 'flex', 6 | flexDirection: 'column' 7 | })) 8 | 9 | export const StatsItem = styled(Grid)(({ theme }) => ({ 10 | alignItems: 'center', 11 | display: 'flex' 12 | })) 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/drawers/drawer/drawer-actions/drawer-actions.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Root = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | justifyContent: 'flex-end', 6 | padding: theme.spacing(2), 7 | marginLeft: theme.spacing(1), 8 | '& button': { 9 | marginLeft: theme.spacing(2) 10 | } 11 | })) 12 | 13 | export default { Root } 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/drawers/offer-drawer/components/offer-drawer-create.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Details = styled('div')(() => ({ 4 | display: 'flex', 5 | flexDirection: 'column' 6 | })) 7 | 8 | export const SpanText = styled('span')(() => ({ 9 | display: 'inline-block', 10 | verticalAlign: 'middle' 11 | })) 12 | 13 | export default { Details, SpanText } 14 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /locales/en.json 3 | translation: /locales/result/%two_letters_code%.json 4 | languages_mapping: 5 | two_letters_code: 6 | pt-BR: br 7 | en-US: en 8 | - source: /frontend/src/translations/generated/en.json 9 | translation: /frontend/src/translations/result/%two_letters_code%.json 10 | languages_mapping: 11 | two_letters_code: 12 | pt-BR: br 13 | en-US: en 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/lists/issue-payments-list/issue-payments-list.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import List from '@mui/material/List' 3 | import Avatar from '@mui/material/Avatar' 4 | 5 | export const Root = styled(List)(({ theme }) => ({ width: '100%' })) 6 | export const SmallAvatar = styled(Avatar)(({ theme }) => ({ 7 | width: theme.spacing(3), 8 | height: theme.spacing(3) 9 | })) 10 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/menus/topbar-menu/topbar-menu.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import TopbarMenu from './topbar-menu' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Menus/TopbarMenu', 6 | component: TopbarMenu 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/signup-forms/signup-signin/signup-signin.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SignupSignin from './signup-signin' 3 | 4 | export default { 5 | title: 'Design Library/Organisms/Forms/SignupForms/SignupSignin', 6 | component: SignupSignin 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/breadcrumbs/breadcrumb/breadcrumb.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const BreadcrumbRoot = styled('div')(({ theme }) => ({ 4 | marginTop: theme.spacing(2), 5 | marginBottom: theme.spacing(2) 6 | })) 7 | 8 | export const BreadcrumbLink = styled('span')(() => ({ 9 | textDecoration: 'underline' 10 | })) 11 | 12 | export default { BreadcrumbRoot, BreadcrumbLink } 13 | -------------------------------------------------------------------------------- /src/app/controllers/contact.js: -------------------------------------------------------------------------------- 1 | const contactRecruiters = require('../../modules/contact').contactRecruiters 2 | 3 | exports.contactRecruiters = (req, res) => { 4 | contactRecruiters(req.body) 5 | .then((data) => { 6 | res.status(200).send(data) 7 | }) 8 | .catch((error) => { 9 | // eslint-disable-next-line no-console 10 | console.log('error on contactRecruiters', error) 11 | res.status(401).send(error) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /src/modules/mail/handleError.js: -------------------------------------------------------------------------------- 1 | module.exports = (error) => { 2 | // error is an instance of SendGridError 3 | // The full response is attached to error.response 4 | // eslint-disable-next-line no-console 5 | console.log('error to send email:') 6 | // eslint-disable-next-line no-console 7 | console.log(error.response.body.errors) 8 | // eslint-disable-next-line no-console 9 | console.log(error.response.statusCode) 10 | return error 11 | } 12 | -------------------------------------------------------------------------------- /test/data/github/github.issue.error.js: -------------------------------------------------------------------------------- 1 | module.exports.limitException = { 2 | message: 3 | "API rate limit exceeded for 87.52.110.50. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.) If you reach out to GitHub Support for help, please include the request ID FF0B:15FEB:9CD277E:9D9D116:66193B8E.", 4 | documentation_url: 'https://docs.github.com/rest/overview/rate-limits-for-the-rest-api' 5 | } 6 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/empty/empty-bank-account/empty-bank-account.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import EmptyBankAccount from './empty-bank-account' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Empty/EmptyBankAccount', 6 | component: EmptyBankAccount 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | -------------------------------------------------------------------------------- /src/app/routes/payout.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const secure = require('./secure') 4 | require('../../modules/authenticationHelpers') 5 | const controllers = require('../controllers/payout') 6 | 7 | router.use(secure) 8 | router.post('/create', controllers.createPayout) 9 | router.post('/request', controllers.requestPayout) 10 | router.get('/search', controllers.searchPayout) 11 | 12 | module.exports = router 13 | -------------------------------------------------------------------------------- /src/app/routes/transfer.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/transfer') 5 | 6 | router.post('/create', controllers.createTransfer) 7 | router.get('/search', controllers.searchTransfer) 8 | router.put('/update', controllers.updateTransfer) 9 | router.get('/fetch/:id', controllers.fetchTransfer) 10 | 11 | module.exports = router 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/headers/profile-main-header/profile-main-header.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const ProfileHeaderContainer = styled('div')(({ theme }) => ({ 4 | marginBottom: 20, 5 | display: 'flex', 6 | flexDirection: 'row', 7 | justifyContent: 'space-between', 8 | [theme.breakpoints.down('sm')]: { 9 | flexDirection: 'column', 10 | alignItems: 'flex-start' 11 | } 12 | })) 13 | -------------------------------------------------------------------------------- /src/db/migrations/20180606135249-add-assigned-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'assigned', { 4 | type: Sequelize.INTEGER, 5 | references: { 6 | model: 'Assigns', 7 | key: 'id' 8 | }, 9 | allowNull: true 10 | }) 11 | }, 12 | 13 | down: (queryInterface, Sequelize) => { 14 | queryInterface.removeColumn('Tasks', 'assigned') 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/db/migrations/20210405203758-change-order-source-not-unique.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | return queryInterface.changeColumn('Orders', 'source', { 4 | type: Sequelize.STRING, 5 | unique: false 6 | }) 7 | }, 8 | 9 | down: (queryInterface, Sequelize) => { 10 | return queryInterface.changeColumn('Orders', 'source', { 11 | type: Sequelize.STRING, 12 | unique: true 13 | }) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/checkbox-terms/checkbox-terms.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import Checkbox from '@mui/material/Checkbox' 3 | import FormControlLabel from '@mui/material/FormControlLabel' 4 | 5 | export const StyledCheckbox = styled(Checkbox)(({ theme }) => ({ 6 | paddingRight: 5 7 | })) 8 | 9 | export const StyledFormControlLabel = styled(FormControlLabel)(({ theme }) => ({ 10 | paddingTop: 0 11 | })) 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/issue/issue-price-field/issue-price-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { useIntl } from 'react-intl' 3 | import AmountField from '../../base/amount-field/amount-field' 4 | 5 | const IssuePriceField = ({ issue }) => { 6 | const intl = useIntl() 7 | const { value } = issue 8 | return 9 | } 10 | 11 | export default IssuePriceField 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/public-pages/four-o-four-public-page/four-o-four.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import FourOFour from './four-o-four-public-page' 3 | 4 | export default { 5 | title: 'Design Library/Pages/Public/FourOFour', 6 | component: FourOFour 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if any 14 | } 15 | -------------------------------------------------------------------------------- /src/app/controllers/team.js: -------------------------------------------------------------------------------- 1 | const requestJoinCoreTeam = require('../../modules/team').requestJoinCoreTeam 2 | 3 | exports.requestJoinCoreTeamController = (req, res) => { 4 | requestJoinCoreTeam(req.body) 5 | .then((data) => { 6 | res.status(200).send(data) 7 | }) 8 | .catch((error) => { 9 | // eslint-disable-next-line no-console 10 | console.log('error on requestJoinCoreTeam', error) 11 | res.status(401).send(error) 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /src/db/migrations/20201217203513-add-projectId-to-task.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Tasks', 'ProjectId', { 4 | type: Sequelize.INTEGER, 5 | references: { 6 | model: 'Projects', 7 | key: 'id' 8 | }, 9 | allowNull: true 10 | }) 11 | }, 12 | 13 | down: (queryInterface, Sequelize) => { 14 | queryInterface.removeColumn('Tasks', 'ProjectId') 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/form-section/login-form/login-form-signin/login-form-signin.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import LoginFormSignin from './login-form-signin' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/FormSection/LoginForm/LoginFormSignin', 6 | component: LoginFormSignin 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Signin = Template.bind({}) 12 | Signin.args = {} 13 | -------------------------------------------------------------------------------- /frontend/src/containers/account-activation.ts: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import { activateUser } from '../actions/userActions' 3 | import AccountActivation from '../components/areas/public/features/session/pages/account-activation-page' 4 | 5 | const mapDispatchToProps = (dispatch) => ({ 6 | activateAccount: (token: string, userId: number) => dispatch(activateUser(userId, token)) 7 | }) 8 | 9 | export default connect(null, mapDispatchToProps)(AccountActivation) 10 | -------------------------------------------------------------------------------- /src/app/controllers/label.js: -------------------------------------------------------------------------------- 1 | const labelSearch = require('../../modules/label').labelSearch 2 | 3 | exports.labelSearchController = (req, res) => { 4 | // Use query parameters for GET requests 5 | labelSearch(req.query) 6 | .then((data) => { 7 | res.status(200).send(data) 8 | }) 9 | .catch((error) => { 10 | // eslint-disable-next-line no-console 11 | console.log('error on types', error) 12 | res.status(401).send(error) 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /src/db/migrations/20210605214301-add-coupon-to-order.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | return queryInterface.addColumn('Orders', 'couponId', { 4 | type: Sequelize.INTEGER, 5 | references: { 6 | model: 'Coupons', 7 | key: 'id' 8 | }, 9 | allowNull: true 10 | }) 11 | }, 12 | 13 | down: (queryInterface, Sequelize) => { 14 | queryInterface.removeColumn('Orders', 'couponId') 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/db/migrations/20220412120201-change-offer-comment-char-limit.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | return queryInterface.changeColumn('Offers', 'comment', { 4 | type: Sequelize.STRING(1000), 5 | unique: false 6 | }) 7 | }, 8 | 9 | down: (queryInterface, Sequelize) => { 10 | return queryInterface.changeColumn('Offers', 'comment', { 11 | type: Sequelize.STRING, 12 | unique: true 13 | }) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/checkbox-terms/checkbox-terms.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import CheckboxTerms from './checkbox-terms' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/inputs/CheckboxTerms', 6 | component: CheckboxTerms 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | onchange: () => {}, 14 | onAccept: () => {} 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/input-comment/input-comment.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import InputComment from './input-comment' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Inputs/InputComment', 6 | component: InputComment 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | placeholder: 'Write a comment...', 14 | value: '' 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/radios/radios.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { FormControlLabel as MuiFormControlLabel, Box as MuiBox } from '@mui/material' 3 | 4 | export const RowFormControlLabel = styled(MuiFormControlLabel)(({ theme }) => ({ 5 | margin: '4px 0', 6 | display: 'flex', 7 | alignItems: 'flex-start' 8 | })) 9 | 10 | export const ContentBox = styled(MuiBox)(({ theme }) => ({ 11 | marginTop: 10 12 | })) 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/solution-input/solution-input.styles.ts: -------------------------------------------------------------------------------- 1 | // Styles for Solution Input component 2 | // Using MUI sx style object so it can be passed directly via the `sx` prop. 3 | // Keep minimal to preserve existing appearance while centralizing styles. 4 | import { SxProps, Theme } from '@mui/material/styles' 5 | 6 | export const solutionInputSx: SxProps = { 7 | '& .MuiFilledInput-input': { 8 | padding: '12px 14px' 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/empty/empty-payment-request/empty-payment-request.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import EmptyPaymentRequest from './empty-payment-request' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Empty/EmptyPaymentRequest', 6 | component: EmptyPaymentRequest 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/form-section/card-number-form/card-number-form.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { CardElement } from '@stripe/react-stripe-js' 3 | 4 | const CardSection = (props) => { 5 | return ( 6 | 15 | ) 16 | } 17 | 18 | export default CardSection 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/form-section/login-form/login-form-forgot/login-form-forgot.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import LoginFormForgot from './login-form-forgot' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/FormSection/LoginForm/LoginFormForgot', 6 | component: LoginFormForgot 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/payout-forms/payout-schedule-form/payout-schedule-form.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const RightActions = styled('div')(({ theme }) => ({ 4 | marginTop: 20, 5 | display: 'flex', 6 | justifyContent: 'flex-end' 7 | })) 8 | 9 | export const AutomaticOptions = styled('div')(({ theme }) => ({ 10 | width: 400, 11 | '& .MuiTypography-caption': { 12 | marginTop: 20 13 | } 14 | })) 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/signup-forms/signup-signin/signup-signin.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const SecondaryActionsContainerStyled = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | justifyContent: 'space-around', 6 | marginRight: 20, 7 | [theme.breakpoints.down('sm')]: { 8 | marginTop: 10, 9 | marginRight: 0, 10 | width: '100%', 11 | justifyContent: 'center' 12 | } 13 | })) 14 | -------------------------------------------------------------------------------- /src/app/routes/paymentRequest.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const secure = require('./secure') 5 | const controllers = require('../controllers/payment-request') 6 | 7 | router.use(secure) 8 | router.post('/', controllers.createPaymentRequest) 9 | router.get('/', controllers.listPaymentRequests) 10 | router.put('/:id', controllers.updatePaymentRequest) 11 | 12 | module.exports = router 13 | -------------------------------------------------------------------------------- /test/data/stripe/balance.transaction.js: -------------------------------------------------------------------------------- 1 | module.exports.get = { 2 | id: 'txn_1CdprOLlCJ9CeQRe7gBPy9Lo', 3 | object: 'balance_transaction', 4 | amount: -400, 5 | available_on: 1678043844, 6 | created: 1678043844, 7 | currency: 'usd', 8 | description: null, 9 | exchange_rate: null, 10 | fee: 0, 11 | fee_details: [], 12 | net: -400, 13 | reporting_category: 'transfer', 14 | source: 'tr_1CZ5vkLlCJ9CeQRe', 15 | status: 'available', 16 | type: 'transfer' 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/checkboxes/checkboxes.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Checkbox } from '@mui/material' 3 | 4 | export const CheckboxesContainer = styled('div')(({ theme }) => ({ 5 | color: '#a9a9a9' 6 | })) 7 | 8 | export const CheckboxItem = styled('div')(({ theme }) => ({ 9 | paddingBottom: 0 10 | })) 11 | 12 | export const StyledCheckbox = styled(Checkbox)(({ theme }) => ({ 13 | paddingRight: 5 14 | })) 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/private-pages/data-pages/primary-data-page/primary-data-page.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const CardsWrapper = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | gap: '16px', 6 | marginBottom: '16px', 7 | justifyContent: 'flex-end', 8 | [theme.breakpoints.down('sm')]: { 9 | flexDirection: 'column', 10 | alignItems: 'stretch', 11 | border: '1px solid red' 12 | } 13 | })) 14 | -------------------------------------------------------------------------------- /frontend/src/types/table.ts: -------------------------------------------------------------------------------- 1 | import { type CardProps } from './card' 2 | 3 | export type TableTabsContentProps = { 4 | tableData: { 5 | completed: boolean 6 | data: Array 7 | } 8 | tableHeaderMetadata: any 9 | customColumnRenderer?: { [key: string]: (value: any, rowData: any) => React.ReactNode } 10 | } 11 | 12 | export type TableTabsProps = { 13 | label: React.ReactNode 14 | value: string 15 | table: TableTabsContentProps 16 | cards?: Array 17 | } 18 | -------------------------------------------------------------------------------- /test/data/stripe/stripe.invoiceitem.js: -------------------------------------------------------------------------------- 1 | module.exports.created = { 2 | id: 'ii_1Q2fh8BrSjgsps2DQqY9k2h3', 3 | currency: 'usd', 4 | customer: 'cus_QsYn1aSStYv4tf', 5 | description: 6 | 'Development service for solving an issue on Gitpay: Add language to issue on explore (http://localhost:3000/#/task/15)', 7 | invoice: 'in_1Q2fh8BrSjgsps2DUqQsGLDj', 8 | metadata: { 9 | order_id: '13', 10 | task_id: '15' 11 | }, 12 | quantity: '1', 13 | unit_amount: '10800' 14 | } 15 | -------------------------------------------------------------------------------- /docker-compose.test.yml: -------------------------------------------------------------------------------- 1 | version: '3.7' 2 | 3 | services: 4 | backend_test: 5 | image: node:8.6 6 | command: sh -c "npm install && npm run migrate-test && npm run test" 7 | working_dir: /gitpay 8 | volumes: 9 | - .:/gitpay 10 | environment: 11 | - NODE_ENV=test 12 | network_mode: host 13 | db_test: 14 | image: postgres 15 | environment: 16 | - POSTGRES_PASSWORD=postgres 17 | - POSTGRES_DB=gitpay_test 18 | network_mode: host -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tabs/bank-account-tabs/bank-account-tabs.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import BankAccountTabs from './bank-account-tabs' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tabs/BankAccountTabs', 6 | component: BankAccountTabs 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if needed 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/payment-request-forms/payment-request-form/payment-request-form.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const AlertWrapper = styled('div')(({ theme }) => ({ 4 | marginBottom: 20, 5 | marginTop: 20 6 | })) 7 | 8 | export const AlertInner = styled('div')(({ theme }) => ({ 9 | marginBottom: 20 10 | })) 11 | 12 | export const EndAdornment = styled('div')(({ theme }) => ({ 13 | marginLeft: 8 14 | })) 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/import-issue-button/import-issue-button.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ImportIssueButton from './import-issue-button' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Buttons/ImportIssueButton', 6 | component: ImportIssueButton 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/issue-actions/issue-actions.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ActionButtons from '../action-buttons/action-buttons' 3 | 4 | interface IssueActionsProps { 5 | role: string 6 | roles: any 7 | children?: React.ReactNode 8 | } 9 | 10 | const IssueActions = ({ role, roles }: IssueActionsProps) => { 11 | return 12 | } 13 | 14 | export default IssueActions 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/drawers/offer-drawer/components/actions.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const Root = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | justifyContent: 'space-between', 6 | padding: theme.spacing(2) 7 | })) 8 | 9 | export const RightActions = styled('div')(() => ({ 10 | display: 'flex', 11 | justifyContent: 'flex-end', 12 | margin: 10 13 | })) 14 | 15 | export default { Root, RightActions } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/text-field/text-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import TextField from './text-field' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tables/Base/TextField', 6 | component: TextField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | title: 'Sample Text Field' 14 | } 15 | -------------------------------------------------------------------------------- /src/app/routes/wallet.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/wallet') 5 | const secure = require('./secure') 6 | 7 | router.use(secure) 8 | 9 | router.post('/', controllers.createWallet) 10 | router.put('/:id', controllers.updateWallet) 11 | router.get('/', controllers.walletList) 12 | router.get('/:id', controllers.walletFetch) 13 | 14 | module.exports = router 15 | -------------------------------------------------------------------------------- /src/models/assign.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const Assign = sequelize.define('Assign', { 3 | status: { 4 | type: DataTypes.STRING, 5 | defaultValue: 'pending' 6 | }, 7 | message: { 8 | type: DataTypes.STRING 9 | } 10 | }) 11 | 12 | Assign.associate = (models) => { 13 | Assign.belongsTo(models.User, { foreignKey: 'userId' }) 14 | Assign.belongsTo(models.Task, { foreignKey: 'TaskId' }) 15 | } 16 | 17 | return Assign 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/price-input/price-input.styles.ts: -------------------------------------------------------------------------------- 1 | import { Theme } from '@mui/material/styles' 2 | 3 | export const getPriceInputStyles = (theme: Theme) => ({ 4 | formPayment: { 5 | marginTop: 10, 6 | marginBottom: 10 7 | }, 8 | currencySymbol: { 9 | fontSize: 28 10 | }, 11 | input: { 12 | fontSize: 42, 13 | fontWeight: 'bold', 14 | textAlign: 'right', 15 | height: 98 16 | } 17 | }) 18 | 19 | export default getPriceInputStyles 20 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/issue-forms/import-issue/import-issue.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ImportIssue from './import-issue' 3 | 4 | export default { 5 | title: 'Design Library/Organisms/Forms/IssueForms/ImportIssue', 6 | component: ImportIssue 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | onImport: () => {} 15 | } 16 | -------------------------------------------------------------------------------- /src/db/migrations/20201218194527-add-organizationId-to-project.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | up: (queryInterface, Sequelize) => { 3 | queryInterface.addColumn('Projects', 'OrganizationId', { 4 | type: Sequelize.INTEGER, 5 | references: { 6 | model: 'Organizations', 7 | key: 'id' 8 | }, 9 | allowNull: true 10 | }) 11 | }, 12 | 13 | down: (queryInterface, Sequelize) => { 14 | queryInterface.removeColumn('Projects', 'OrganizationId') 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/modules/team/requestJoinCoreTeam.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const SendMail = require('../mail/mail') 3 | const { joinTeamEmail } = require('../mail/constants') 4 | 5 | module.exports = Promise.method(function requestJoinCoreTeam(params) { 6 | SendMail.success( 7 | { email: joinTeamEmail, language: 'en', receiveNotifications: true }, 8 | 'Want to join Core Team', 9 | 'The user with the email ' + params.param.email + ' wants to join to Gitpay core tem' 10 | ) 11 | }) 12 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/dashboard-card-list/dashboard-card-list.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const ContentWrapper = styled('div')({ 4 | marginBottom: 40 5 | }) 6 | 7 | export const CardList = styled('div')(({ theme }) => ({ 8 | alignItems: 'center', 9 | display: 'flex', 10 | justifyContent: 'center', 11 | flexWrap: 'wrap', 12 | [theme.breakpoints.down('sm')]: { 13 | display: 'block' 14 | } 15 | })) 16 | -------------------------------------------------------------------------------- /frontend/src/containers/team.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import Team from '../components/areas/public/features/team/pages/team' 3 | import { joinTeam } from '../actions/teamActions' 4 | 5 | const mapStateToProps = (state, ownProps) => { 6 | return state 7 | } 8 | 9 | const mapDispatchToProps = (dispatch, ownProps) => { 10 | return { 11 | joinTeamAPICall: (email) => dispatch(joinTeam(email)) 12 | } 13 | } 14 | 15 | export default connect(mapStateToProps, mapDispatchToProps)(Team) 16 | -------------------------------------------------------------------------------- /frontend/src/main/app.css: -------------------------------------------------------------------------------- 1 | html { 2 | margin: 0; 3 | height: 100%; 4 | } 5 | 6 | body { 7 | margin: 0; 8 | height: 100%; 9 | } 10 | 11 | #app { 12 | height: 100%; 13 | } 14 | 15 | #app > div 16 | { 17 | height: 100%; 18 | } 19 | 20 | a { 21 | color: inherit; 22 | } 23 | 24 | .MuiTypography-noWrap-112 { 25 | overflow: hidden; 26 | white-space: normal !important; 27 | text-overflow: ellipsis; 28 | } 29 | 30 | .MuiTypography-body2 img { 31 | width: 100%; 32 | height: 100%; 33 | } 34 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/account/components/account-tab-main.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import Typography from '@mui/material/Typography' 3 | 4 | export const LegendText = styled(Typography)(({ theme }) => ({ 5 | fontSize: 18, 6 | fontWeight: 500, 7 | color: theme.palette.primary.dark 8 | })) 9 | 10 | export const Fieldset = styled('fieldset')(({ theme }) => ({ 11 | border: `1px solid ${theme.palette.primary.light}`, 12 | marginBottom: 20 13 | })) 14 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fields/account-type-field/account-type.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import AccountTypeField from './account-type-field' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Inputs/Fields/AccountTypeField', 6 | component: AccountTypeField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | disabled: false, 14 | type: 'individual' 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/form-section/login-form/login-form-reset/login-form-reset.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import LoginFormReset from './login-form-reset' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/FormSection/LoginForm/LoginFormReset', 6 | component: LoginFormReset 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tabs/payout-settings-tabs/payout-settings-tabs.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PayoutSettingsTabs from './payout-settings-tabs' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tabs/PayoutSettingsTabs', 6 | component: PayoutSettingsTabs 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if needed 14 | } 15 | -------------------------------------------------------------------------------- /src/db/migrations/20251211223254-add-arrival-date-to-payout.ts: -------------------------------------------------------------------------------- 1 | import { QueryInterface, DataTypes } from 'sequelize' 2 | 3 | export async function up({ queryInterface }: { queryInterface: QueryInterface }) { 4 | await queryInterface.addColumn('Payouts', 'arrival_date', { 5 | type: DataTypes.BIGINT, 6 | allowNull: true 7 | }) 8 | } 9 | 10 | export async function down({ queryInterface }: { queryInterface: QueryInterface }) { 11 | await queryInterface.removeColumn('Payouts', 'arrival_date') 12 | } 13 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "pwa-chrome", 9 | "request": "launch", 10 | "name": "Launch Chrome against localhost", 11 | "url": "http://localhost:8080", 12 | "webRoot": "${workspaceFolder}" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/signin-buttons/signin-buttons.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SignInButtons from './signin-buttons' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Buttons/SignInButtons', 6 | component: SignInButtons 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | onSignup: () => {}, 15 | onSignin: () => {} 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/switchers/language-switcher/language-switcher.styles.ts: -------------------------------------------------------------------------------- 1 | import { Avatar } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | import media from '../../../../../styleguide/media' 4 | 5 | export const StyledAvatarIconOnly = styled(Avatar)` 6 | margin-left: 20px; 7 | cursor: pointer; 8 | align-items: center; 9 | ${media.phone`margin-left: 15px;`} 10 | 11 | @media(max-width: 37.5em) { 12 | margin-bottom: 20px !important; 13 | } 14 | ` 15 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/account/features/account-skills/skill.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Avatar } from '@mui/material' 3 | 4 | // Styled Avatar for the Skill component 5 | export const SkillAvatar = styled(Avatar, { 6 | shouldForwardProp: (prop) => prop !== 'greyed' 7 | })<{ greyed?: boolean }>(({ theme, greyed }) => ({ 8 | borderRadius: 0, 9 | backgroundColor: 'transparent', 10 | ...(greyed && { 11 | filter: 'grayscale(0.8)' 12 | }) 13 | })) 14 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/explore/pages/explore-projects-page.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react' 2 | import ProjectListFull from 'design-library/molecules/lists/project-list/project-list-full/project-list-full' 3 | 4 | const ExploreProjectsPage = ({ listProjects, projects }) => { 5 | useEffect(() => { 6 | listProjects() 7 | }, []) 8 | 9 | return ( 10 | <> 11 | 12 | 13 | ) 14 | } 15 | 16 | export default ExploreProjectsPage 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/provider-login-buttons/provider-login-buttons.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ProviderLoginButtons from './provider-login-buttons' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Buttons/ProviderLoginButtons', 6 | component: ProviderLoginButtons 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if any 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/buttons/provider-login-buttons/provider-login-buttons.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const ButtonWithMargin = styled('span')(() => ({ 4 | marginRight: 10 5 | })) 6 | 7 | export const TextMargin = styled('span')(() => ({ 8 | marginLeft: 10 9 | })) 10 | 11 | export const LinkMargin = styled('a')(() => ({ 12 | display: 'inline-box', 13 | marginLeft: 5 14 | })) 15 | 16 | export default { ButtonWithMargin, TextMargin, LinkMargin } 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/created-field/created-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import CreatedField from './created-field' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tables/Base/CreatedField', 6 | component: CreatedField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | createdAt: '2023-10-01T12:00:00Z' 14 | } 15 | -------------------------------------------------------------------------------- /src/app/controllers/payment-request-balance.ts: -------------------------------------------------------------------------------- 1 | import { paymentRequestBalanceList } from '../../modules/paymentRequestBalance' 2 | 3 | export const listPaymentRequestBalances = async (req: any, res: any) => { 4 | const userId = req.user.id 5 | 6 | try { 7 | const balances = await paymentRequestBalanceList({ userId }) 8 | res.status(200).json(balances) 9 | } catch (error: any) { 10 | console.error('Error retrieving balances:', error) 11 | res.status(500).json({ error: error.message }) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/app/controllers/payment-request-payment.ts: -------------------------------------------------------------------------------- 1 | import { paymentRequestPaymentList } from '../../modules/paymentRequestPayments' 2 | 3 | export const listPaymentRequestPayments = async (req: any, res: any) => { 4 | const userId = req.user.id 5 | 6 | try { 7 | const payments = await paymentRequestPaymentList({ userId }) 8 | res.status(200).json(payments) 9 | } catch (error: any) { 10 | console.error('Error retrieving payments:', error) 11 | res.status(500).json({ error: error.message }) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/db/migrations/20251211232235-add-reference-number-to-payout.ts: -------------------------------------------------------------------------------- 1 | import { QueryInterface, DataTypes } from 'sequelize' 2 | 3 | export async function up({ queryInterface }: { queryInterface: QueryInterface }) { 4 | await queryInterface.addColumn('Payouts', 'reference_number', { 5 | type: DataTypes.STRING, 6 | allowNull: true 7 | }) 8 | } 9 | 10 | export async function down({ queryInterface }: { queryInterface: QueryInterface }) { 11 | await queryInterface.removeColumn('Payouts', 'reference_number') 12 | } 13 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "CommonJS", 5 | "moduleResolution": "Node", 6 | 7 | "rootDir": "src", 8 | "outDir": "dist", 9 | 10 | "allowJs": true, // <-- keep .js files 11 | "checkJs": false, // you can flip true later to typecheck .js 12 | "esModuleInterop": true, 13 | "resolveJsonModule": true, 14 | "skipLibCheck": true, 15 | 16 | "strict": true, 17 | "noEmitOnError": true 18 | }, 19 | "include": ["src/**/*"] 20 | } 21 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/projects/project-page.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | // Wrapper for the tabbed table area 4 | export const RootTabs = styled('div')(({ theme }) => ({ 5 | marginRight: theme.spacing(3), 6 | marginBottom: theme.spacing(3) 7 | })) 8 | 9 | // Optional utility styles kept for future parity if needed 10 | export const GutterLeft = styled('div')({ 11 | marginLeft: 10 12 | }) 13 | 14 | export const Media = styled('div')({ 15 | width: 600 16 | }) 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/sections/stats-bar/stats-bar.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import StatsBar from './stats-bar' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Sections/StatsBar', 6 | component: StatsBar 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | info: () => {}, 15 | tasks: '20', 16 | bounties: '2000', 17 | users: '5000' 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/amount-field/amount-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import AmountField from './amount-field' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tables/Base/AmountField', 6 | component: AmountField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | value: 1000 15 | } 16 | -------------------------------------------------------------------------------- /pmd.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/app/routes/walletOrder.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/walletOrder') 5 | const secure = require('./secure') 6 | 7 | router.use(secure) 8 | 9 | router.post('/', controllers.createWalletOrder) 10 | router.put('/:id', controllers.updateWalletOrder) 11 | router.get('/', controllers.walletOrderList) 12 | router.get('/:id', controllers.walletOrderFetch) 13 | 14 | module.exports = router 15 | -------------------------------------------------------------------------------- /src/modules/paymentRequests/paymentRequestList.js: -------------------------------------------------------------------------------- 1 | const Stripe = require('stripe') 2 | const models = require('../../models') 3 | 4 | module.exports = async function paymentRequestList(paymentRequestParams) { 5 | const paymentRequestList = await models.PaymentRequest.findAll({ 6 | where: { 7 | userId: paymentRequestParams.userId 8 | }, 9 | order: [['createdAt', 'DESC']], 10 | include: [ 11 | { 12 | model: models.User 13 | } 14 | ] 15 | }) 16 | return paymentRequestList 17 | } 18 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Python & PostgreSQL Dev Container", 3 | "dockerComposeFile": "docker-compose.yml", 4 | "service": "app", 5 | "workspaceFolder": "/workspace", 6 | "extensions": [ 7 | "ms-python.python", 8 | "ms-azuretools.vscode-docker", 9 | "ms-vscode-remote.remote-containers" 10 | ], 11 | "forwardPorts": [5432, 3000, 8082], 12 | "postCreateCommand": "pip install -r requirements.txt", 13 | "settings": { 14 | "terminal.integrated.shell.linux": "/bin/bash" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/loaders/loader/loader.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import CircularProgress from '@mui/material/CircularProgress' 3 | 4 | export const Root = styled('div')(() => ({ 5 | flexGrow: 1, 6 | display: 'flex', 7 | justifyContent: 'center', 8 | alignItems: 'center', 9 | height: '100%' 10 | })) 11 | 12 | export const Progress = styled(CircularProgress)(() => ({ 13 | color: '#009688' 14 | })) 15 | 16 | export default { 17 | Root, 18 | Progress 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/drawers/drawer/drawer.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Fab } from '@mui/material' 3 | 4 | export const CloseFab = styled(Fab)(({ theme }) => ({ 5 | position: 'absolute', 6 | right: theme.spacing(2), 7 | top: theme.spacing(2), 8 | backgroundColor: 'darkgray', 9 | color: 'white', 10 | boxShadow: 'none', 11 | '&:hover': { 12 | backgroundColor: 'gray', 13 | boxShadow: 'none' 14 | } 15 | })) 16 | 17 | export default { CloseFab } 18 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/dropdowns/issue-level-dropdown/issue-level-dropdown.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/react' 2 | import IssueLevelDropdown from './issue-level-dropdown' 3 | 4 | const meta: Meta = { 5 | title: 'Design Library/Atoms/Inputs/Dropdowns/IssueLevelDropdown', 6 | component: IssueLevelDropdown 7 | } 8 | 9 | export default meta 10 | 11 | type Story = StoryObj 12 | 13 | export const Default: Story = { 14 | args: {} 15 | } 16 | -------------------------------------------------------------------------------- /src/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "development": { 3 | "username": "postgres", 4 | "password": "postgres", 5 | "database": "gitpay_dev", 6 | "host": "127.0.0.1", 7 | "port": 5432, 8 | "dialect": "postgres", 9 | "logging": false, 10 | "operatorsAliases": false 11 | }, 12 | "test": { 13 | "username": "postgres", 14 | "password": "postgres", 15 | "database": "gitpay_test", 16 | "host": "127.0.0.1", 17 | "port": 5432, 18 | "dialect": "postgres", 19 | "logging": false 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/modules/tasks/taskExists.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | const Promise = require('bluebird') 3 | 4 | module.exports = Promise.method(function taskExists(taskAttributes) { 5 | return models.Task.findOne({ 6 | where: { 7 | id: taskAttributes.id 8 | } 9 | }) 10 | .then((task) => { 11 | if (!task) return false 12 | return task 13 | }) 14 | .catch((error) => { 15 | // eslint-disable-next-line no-console 16 | console.log(error) 17 | throw error 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/explore/pages/explore-organization-page.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react' 2 | import OrganizationsListFull from 'design-library/molecules/lists/organization-list/organization-list-full/organization-list-full' 3 | 4 | const ExploreOrganizationPage = ({ organizations, listOrganizations }) => { 5 | useEffect(() => { 6 | listOrganizations?.() 7 | }, []) 8 | 9 | return 10 | } 11 | 12 | export default ExploreOrganizationPage 13 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/payout-forms/payout-schedule-form/payout-schedule-form.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PayoutScheduleForm from './payout-schedule-form' 3 | 4 | export default { 5 | title: 'Design Library/Organisms/Forms/PayoutForms/PayoutScheduleForm', 6 | component: PayoutScheduleForm 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if needed 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/containers/task-solve.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import { getTaskOrdersByFilter } from '../selectors/task' 3 | import TaskSolve from '../components/areas/public/features/issue/task-solve' 4 | 5 | const mapStateToProps = (state, ownProps) => { 6 | return { 7 | logged: state.loggedIn, 8 | task: getTaskOrdersByFilter(state) 9 | } 10 | } 11 | 12 | const mapDispatchToProps = (dispatch, ownProps) => { 13 | return {} 14 | } 15 | 16 | export default connect(mapStateToProps, mapDispatchToProps)(TaskSolve) 17 | -------------------------------------------------------------------------------- /src/models/label.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const Label = sequelize.define( 3 | 'Label', 4 | { 5 | name: DataTypes.STRING 6 | }, 7 | {} 8 | ) 9 | Label.associate = function (models) { 10 | Label.belongsToMany(models.Task, { 11 | alloqNull: false, 12 | foreignKey: 'labelId', 13 | otherKey: 'taskId', 14 | through: 'TaskLabels', 15 | onUpdate: 'cascade', 16 | onDelete: 'cascade', 17 | hooks: true 18 | }) 19 | } 20 | 21 | return Label 22 | } 23 | -------------------------------------------------------------------------------- /src/modules/organizations/organizationBuilds.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(function organizationBuilds(organizationParameters) { 5 | return models.Organization.build(organizationParameters) 6 | .save() 7 | .then((data) => { 8 | return data 9 | }) 10 | .catch((error) => { 11 | // eslint-disable-next-line no-console 12 | console.log('error from organizationBuilds', error) 13 | return false 14 | }) 15 | }) 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/alerts/simple-info/simple-info.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Info as InfoIcon } from '@mui/icons-material' 3 | import { SimpleInfoRoot, IconCenter, Text } from './simple-info.styles' 4 | 5 | export const SimpleInfo = ({ text }) => { 6 | return ( 7 | 8 | 9 | 10 | 11 |
12 | {text} 13 |
14 |
15 | ) 16 | } 17 | 18 | export default SimpleInfo 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/loaders/placeholders/avatar-placeholder.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { AvatarPlaceholder } from './avatar-placeholder' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Loaders/Placeholders/AvatarPlaceholder', 6 | component: AvatarPlaceholder 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | src: 'https://via.placeholder.com/150', 14 | alt: 'Default Avatar' 15 | } 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/typography/secondary-title/secondary-title.stories.tsx: -------------------------------------------------------------------------------- 1 | import SecondaryTitle from './secondary-title' 2 | 3 | const meta = { 4 | title: 'Design Library/Atoms/Typography/Titles/SecondaryTitle', 5 | component: SecondaryTitle, 6 | args: { 7 | title: 'Sample Title', 8 | subtitle: 'This is a subtitle' 9 | } 10 | } 11 | 12 | export default meta 13 | 14 | export const Default = { 15 | args: { 16 | title: 'Default Title', 17 | subtitle: 'This is a default subtitle' 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/spot-card/spot-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { Card, CardContent } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const StyledCard = styled(Card)(() => ({ 5 | minWidth: 420, 6 | marginTop: 40, 7 | opacity: 0.8, 8 | overflow: 'visible' 9 | })) 10 | 11 | export const StyledCardContent = styled(CardContent)(() => ({ 12 | textAlign: 'center', 13 | position: 'relative' 14 | })) 15 | 16 | export const Content = styled('div')({ 17 | marginTop: 20 18 | }) 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/introduction/introduction.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Introduction from './introduction' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Content/Introduction', 6 | component: Introduction 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | title: 'Introduction', 14 | image: 'https://via.placeholder', 15 | children: 'This is the introduction text' 16 | } 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/dialogs/privacy-dialog/privacy-dialog.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Dialog, DialogContent } from '@mui/material' 3 | import PrivacyPolicy from '../../content/terms/privacy-policy/privacy-policy' 4 | 5 | const PrivacyDialog = ({ open, onClose }) => { 6 | return ( 7 | 8 | 9 | 10 | 11 | 12 | ) 13 | } 14 | 15 | export default PrivacyDialog 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/dialogs/terms-dialog/terms-dialog.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Dialog, DialogContent } from '@mui/material' 3 | import TermsOfService from '../../content/terms/terms-of-service/terms-of-service' 4 | 5 | const TermsDialog = ({ open, onClose }) => { 6 | return ( 7 | 8 | 9 | 10 | 11 | 12 | ) 13 | } 14 | 15 | export default TermsDialog 16 | -------------------------------------------------------------------------------- /frontend/src/containers/task-filter.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | import { connect } from 'react-redux' 3 | import { filterTasks } from '../actions/taskActions' 4 | import IssueFilter from '../components/design-library/atoms/filters/issue-filter/issue-filter' 5 | 6 | const mapStateToProps = (state) => ({ 7 | issues: state.issues.data, 8 | filteredIssues: state.issues.filteredData 9 | }) 10 | 11 | const mapDispatchToProps = { 12 | filterTasks 13 | } 14 | 15 | export default connect(mapStateToProps, mapDispatchToProps)(IssueFilter) 16 | -------------------------------------------------------------------------------- /frontend/src/reducers/teamReducer.js: -------------------------------------------------------------------------------- 1 | import { JOIN_TEAM_REQUESTED, JOIN_TEAM_SUCCESS, JOIN_TEAM_ERROR } from '../actions/teamActions' 2 | 3 | export const team = (state = { completed: true }, action) => { 4 | switch (action.type) { 5 | case JOIN_TEAM_REQUESTED: 6 | return { ...state, completed: false } 7 | case JOIN_TEAM_SUCCESS: 8 | return { ...state, completed: true } 9 | case JOIN_TEAM_ERROR: 10 | return { ...state, completed: true, error: action.error } 11 | default: 12 | return state 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app/routes/taskSolutions.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('../../modules/authenticationHelpers') 4 | const controllers = require('../controllers/taskSolution') 5 | const secure = require('./secure') 6 | 7 | router.use(secure) 8 | 9 | router.get('/', controllers.getTaskSolution) 10 | router.get('/fetch', controllers.fetchPullRequestData) 11 | router.post('/create', controllers.createTaskSolution) 12 | router.patch('/:id', controllers.updateTaskSolution) 13 | 14 | module.exports = router 15 | -------------------------------------------------------------------------------- /src/modules/orders/orderExists.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | const Promise = require('bluebird') 3 | 4 | module.exports = Promise.method(function orderExists(orderAttributes) { 5 | return models.Order.findOne({ 6 | where: { 7 | id: orderAttributes.id 8 | } 9 | }) 10 | .then((order) => { 11 | if (!order) return false 12 | return order 13 | }) 14 | .catch((error) => { 15 | // eslint-disable-next-line no-console 16 | console.log(error) 17 | throw error 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /frontend/src/main/routes-sitemap.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { path: '/', exact: true }, 3 | { path: '/recruitment' }, 4 | { path: '/tasks/createdbyme' }, 5 | { path: '/tasks/interested' }, 6 | { path: '/tasks/assignedtome' }, 7 | { path: '/tasks/all' }, 8 | { path: '/tasks/open' }, 9 | { path: '/tasks/progress' }, 10 | { path: '/tasks/finished' }, 11 | { path: '/login', exact: true }, 12 | // redirect (usually excluded from sitemap) 13 | { path: '/tasks/explore', redirectTo: '/tasks/open' } 14 | ] 15 | 16 | export default routes 17 | -------------------------------------------------------------------------------- /frontend/translation.js: -------------------------------------------------------------------------------- 1 | const extractReactIntl = require('extract-react-intl') 2 | 3 | const pattern = 'src/**/*.js' 4 | const locales = ['en', 'br'] 5 | 6 | extractReactIntl(locales, pattern).then((result) => { 7 | // eslint-disable-next-line no-console 8 | console.log(JSON.stringify(result)) 9 | 10 | /* 11 | { 12 | en: 13 | { 'components/App/hello': 'hello', 14 | 'components/App/welcome': 'welcome to extract-react-intl' } 15 | ja: 16 | { 'components/App/hello': '', 17 | 'components/App/world': '' } 18 | } 19 | */ 20 | }) 21 | -------------------------------------------------------------------------------- /frontend/build/messages/src/components/profile/preferences.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "preferences.title.main", 4 | "defaultMessage": "Preferences" 5 | }, 6 | { 7 | "id": "preferences.os", 8 | "defaultMessage": "OS" 9 | }, 10 | { 11 | "id": "prefences.header.title", 12 | "defaultMessage": "Preferences" 13 | }, 14 | { 15 | "id": "prefences.header.sub", 16 | "defaultMessage": "My language preferences" 17 | }, 18 | { 19 | "id": "prefences.my.skills.zero", 20 | "defaultMessage": "No skills selected" 21 | } 22 | ] -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/forms/subscribe-forms/subscribe-form/subscribe-form.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import SubscribeForm from './subscribe-form' 3 | 4 | export default { 5 | title: 'Design Library/Organisms/Forms/SubscribeForms/SubscribeForm', 6 | component: SubscribeForm 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here if any 14 | render: true, 15 | type: 'subscribe-form' 16 | } 17 | -------------------------------------------------------------------------------- /src/modules/paymentRequestsTransfers/paymentRequestsTransfersUpdate.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | 3 | module.exports = async function paymentRequestTransferUpdate(paymentRequestTransferUpdateParams) { 4 | const { id, ...updateData } = paymentRequestTransferUpdateParams 5 | const transfer = await models.PaymentRequestTransfer.findByPk(id) 6 | if (!transfer) { 7 | throw new Error('Transfer not found') 8 | } 9 | await transfer.update(updateData, { 10 | returning: true 11 | }) 12 | transfer.reload() 13 | return transfer 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/containers/profile-head.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import ProfileHead from '../components/areas/private/components/profile-head' 3 | import { getUserTypes } from '../actions/profileActions' 4 | 5 | const mapStateToProps = (state) => { 6 | return { 7 | profile: state.profileReducer.data 8 | } 9 | } 10 | 11 | const mapDispatchToProps = (dispatch) => { 12 | return { 13 | getUserTypes: (userId) => dispatch(getUserTypes(userId)) 14 | } 15 | } 16 | 17 | export default connect(mapStateToProps, mapDispatchToProps)(ProfileHead) 18 | -------------------------------------------------------------------------------- /frontend/src/containers/provider-login-buttons.tsx: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import { authorizeGithub, disconnectGithub } from '../actions/loginActions' 3 | import ProviderLoginButtons from '../components/areas/private/components/session/provider-login-buttons' 4 | 5 | const mapDispatchToProps = (dispatch, ownProps) => { 6 | return { 7 | authorizeGithub: () => dispatch(authorizeGithub()), 8 | disconnectGithub: () => dispatch(disconnectGithub()) 9 | } 10 | } 11 | 12 | export default connect(null, mapDispatchToProps)(ProviderLoginButtons) 13 | -------------------------------------------------------------------------------- /src/app/routes/webhooks.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const controllerConnect = require('../controllers/webhooks/webhook-connect') 4 | const controllerPlatform = require('../controllers/webhooks/webhook-platform') 5 | const controllerGithub = require('../controllers/webhooks/webhook-github') 6 | 7 | router.post('/stripe-platform', controllerPlatform.webhookPlatform) 8 | router.post('/stripe-connect', controllerConnect.webhookConnect) 9 | router.post('/github', controllerGithub.github) 10 | 11 | module.exports = router 12 | -------------------------------------------------------------------------------- /frontend/src/styleguide/components/Page.tsx: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const PageContent = styled('div')(({ theme }) => ({ 4 | backgroundColor: '#F7F7F7', 5 | padding: '0 0 0 0' 6 | })) 7 | 8 | export const Page = styled('div')({ 9 | overflowX: 'hidden' 10 | }) 11 | 12 | export const PageContentWrapper = styled('div')(({ theme }) => ({ 13 | display: 'flex', 14 | minHeight: '100%', 15 | flexDirection: 'row', 16 | [theme.breakpoints.down('sm')]: { 17 | display: 'flex', 18 | flexDirection: 'column' 19 | } 20 | })) 21 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/organisms/layouts/bottom-bar-layouts/bottom-bar-layout/bottom-bar-layout.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Bottom from './bottom-bar-layout' 3 | 4 | export default { 5 | title: 'Design Library/Organisms/Layouts/BottomBar/BottomBar', 6 | component: Bottom 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | getInfo: () => {}, 15 | tasks: '20', 16 | bounties: '2000', 17 | users: '5000' 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/pages/public-pages/pricing-public-page/pricing-public-page.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/react' 2 | import PricingPublicPage from './pricing-public-page' 3 | 4 | const meta: Meta = { 5 | title: 'Design Library/Pages/Public/Pricing', 6 | component: PricingPublicPage, 7 | parameters: { 8 | layout: 'fullscreen' 9 | } 10 | } 11 | 12 | export default meta 13 | 14 | type Story = StoryObj 15 | 16 | export const Basic: Story = { 17 | args: {} 18 | } 19 | -------------------------------------------------------------------------------- /src/modules/roles/roleExists.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | const Promise = require('bluebird') 3 | 4 | module.exports = Promise.method(function memberExists(roleAttributes) { 5 | return models.Role.findOne({ 6 | where: { 7 | name: roleAttributes.name 8 | } 9 | }) 10 | .then((role) => { 11 | if (!role) return false 12 | return role 13 | }) 14 | .catch((error) => { 15 | // eslint-disable-next-line no-console 16 | console.log('error to obtain existent role', error) 17 | throw error 18 | }) 19 | }) 20 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fields/birth-date-field/birth-date-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import BirthDateField from './birth-date-field' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Inputs/Fields/BirthDateField', 6 | component: BirthDateField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = {} 13 | 14 | export const PreFilled = Template.bind({}) 15 | PreFilled.args = { 16 | day: 15, 17 | month: 8, 18 | year: 1990 19 | } 20 | -------------------------------------------------------------------------------- /src/models/member.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const Member = sequelize.define('Member', { 3 | roleId: { 4 | type: DataTypes.INTEGER, 5 | references: { 6 | model: 'Roles', 7 | key: 'id' 8 | }, 9 | allowNull: true 10 | } 11 | }) 12 | 13 | Member.associate = (models) => { 14 | Member.belongsTo(models.User, { foreignKey: 'userId' }) 15 | Member.belongsTo(models.Task, { foreignKey: 'taskId' }) 16 | Member.belongsTo(models.Role, { foreignKey: 'roleId' }) 17 | } 18 | 19 | return Member 20 | } 21 | -------------------------------------------------------------------------------- /test/ping.test.js: -------------------------------------------------------------------------------- 1 | // test/ping.test.js 2 | const supertest = require('supertest') 3 | const express = require('express') 4 | const app = express() 5 | 6 | app.get('/ping', (req, res) => { 7 | res.status(200).json({ pong: true }) 8 | }) 9 | 10 | describe('Ping Test', () => { 11 | it('should respond to /ping', (done) => { 12 | supertest(app) 13 | .get('/ping') 14 | .expect(200) 15 | .end((err, res) => { 16 | if (err) return done(err) 17 | console.log(res.body) // deve ser { pong: true } 18 | done() 19 | }) 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fields/phone-number-field/phone-number-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PhoneNumberField from './phone-number-field' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Inputs/Fields/PhoneNumberField', 6 | component: PhoneNumberField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | phone: '1234567890' 14 | } 15 | 16 | export const Empty = Template.bind({}) 17 | Empty.args = { 18 | phone: '' 19 | } 20 | -------------------------------------------------------------------------------- /src/modules/tasks/taskMessageAuthor.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | const TaskMail = require('../mail/task') 4 | const i18n = require('i18n') 5 | 6 | module.exports = Promise.method(function ({ id }, { message }, user) { 7 | return models.Task.findByPk(id, { include: [models.User] }).then((task) => { 8 | const taskUser = task.User.dataValues 9 | const language = taskUser.language || 'en' 10 | i18n.setLocale(language) 11 | TaskMail.messageAuthor(user.dataValues, task, message) 12 | return task 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fields/bank-select-field/bank-select-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import BankSelectField from './bank-select-field' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Inputs/Fields/BankSelectField', 6 | component: BankSelectField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | routingNumber: '123456789', 14 | country: 'BR', 15 | onChange: (e) => console.log(e.target.value), 16 | disabled: false 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/dashboard-cards/bank-account-dashboard-card/bank-account-dashboard-card.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/react' 2 | import BankAccountDashboardCard from './bank-account-dashboard-card' 3 | 4 | const meta: Meta = { 5 | title: 'Design Library/Molecules/Cards/DashboardCards/BankAccountDashboardCard', 6 | component: BankAccountDashboardCard 7 | } 8 | 9 | export default meta 10 | type Story = StoryObj 11 | 12 | export const Default: Story = { 13 | args: {} 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/issue/issue-price-field/issue-price-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import IssuePriceField from './issue-price-field' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tables/Fields/Issue/IssuePriceField', 6 | component: IssuePriceField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | issue: { 15 | value: 100 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/modules/projects/projectList.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(function listProjects() { 5 | return models.Project.findAll({ 6 | include: [ 7 | models.Organization, 8 | { 9 | model: models.Task, 10 | include: [models.User] 11 | } 12 | ] 13 | }) 14 | .then((data) => { 15 | return data 16 | }) 17 | .catch((error) => { 18 | // eslint-disable-next-line no-console 19 | console.log(error) 20 | return false 21 | }) 22 | }) 23 | -------------------------------------------------------------------------------- /src/modules/wallets/walletList.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(async function walletList(params) { 5 | const user = 6 | params.userId && 7 | (await models.User.findOne({ 8 | where: { 9 | id: params.userId 10 | } 11 | })) 12 | 13 | if (!user) { 14 | return { error: 'No valid user' } 15 | } 16 | 17 | return models.Wallet.findAll({ 18 | where: { 19 | userId: user.id 20 | }, 21 | hooks: true, 22 | individualHooks: true 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fieldset/fieldset.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Typography, Skeleton } from '@mui/material' 3 | import { StyledFieldset, StyledLegend } from './fieldset.styles' 4 | 5 | const Fieldset = ({ children, completed, legend }) => { 6 | return ( 7 | 8 | 9 | {legend} 10 | 11 | {!completed ? : children} 12 | 13 | ) 14 | } 15 | 16 | export default Fieldset 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/typography/context-title/context-title.tsx: -------------------------------------------------------------------------------- 1 | import { Skeleton, Typography } from '@mui/material' 2 | import React from 'react' 3 | 4 | const ContextTitle = ({ context, title }) => { 5 | return ( 6 |
7 | {title || } 8 | 9 | {context?.completed ? context?.data.name : } 10 | 11 |
12 | ) 13 | } 14 | 15 | export default ContextTitle 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/dialogs/country-picker-dialog/country-picker-dialog.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import CountryPickerDialog from './country-picker-dialog' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Dialogs/CountryPickerDialog', 6 | component: CountryPickerDialog 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | open: true, 14 | onClose: (e, country) => { 15 | console.log('Dialog closed', e, country) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/containers/bottom.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import Bottom from '../components/shared/bottom/bottom' 3 | import { info } from '../actions/infoActions' 4 | 5 | const mapStateToProps = (state, ownProps) => { 6 | return { 7 | tasks: state.info.data.tasks, 8 | bounties: state.info.data.bounties, 9 | users: state.info.data.users 10 | } 11 | } 12 | 13 | const mapDispatchToProps = (dispatch, ownProps) => { 14 | return { 15 | info: () => dispatch(info()) 16 | } 17 | } 18 | 19 | export default connect(mapStateToProps, mapDispatchToProps)(Bottom) 20 | -------------------------------------------------------------------------------- /src/models/coupon.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const Coupon = sequelize.define('Coupon', { 3 | code: { 4 | type: DataTypes.STRING 5 | }, 6 | amount: { 7 | type: DataTypes.DECIMAL 8 | }, 9 | expires: { 10 | type: DataTypes.BOOLEAN 11 | }, 12 | validUntil: { 13 | type: DataTypes.DATE 14 | }, 15 | times: { 16 | type: DataTypes.INTEGER 17 | } 18 | }) 19 | 20 | Coupon.associate = (models) => { 21 | Coupon.hasMany(models.Order, { foreignKey: 'couponId' }) 22 | } 23 | 24 | return Coupon 25 | } 26 | -------------------------------------------------------------------------------- /src/modules/offers/offerExists.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | const Promise = require('bluebird') 3 | 4 | module.exports = Promise.method(function offerExists(offerAttributes) { 5 | return models.Offer.findOne({ 6 | where: { 7 | userId: offerAttributes.userId, 8 | taskId: offerAttributes.taskId 9 | } 10 | }) 11 | .then((offer) => { 12 | if (!offer) return false 13 | return offer 14 | }) 15 | .catch((error) => { 16 | // eslint-disable-next-line no-console 17 | console.log(error) 18 | throw error 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /src/modules/wallets/walletBuilds.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const Wallet = require('../../models').Wallet 3 | const User = require('../../models').User 4 | 5 | module.exports = Promise.method(async function walletBuilds(params) { 6 | const user = 7 | params.userId && 8 | (await User.findOne({ 9 | where: { 10 | id: params.userId 11 | } 12 | })) 13 | 14 | if (!user) { 15 | return { error: 'No valid user' } 16 | } 17 | 18 | return Wallet.create({ 19 | userId: user.id, 20 | name: params.name, 21 | balance: 0 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/lists/pickup-tag-list/pickup-tag-list.styles.ts: -------------------------------------------------------------------------------- 1 | import { Chip } from '@mui/material' 2 | import { styled } from '@mui/material/styles' 3 | 4 | export const Root = styled('div')(({ theme }) => ({ 5 | display: 'flex', 6 | flexDirection: 'column' 7 | })) 8 | 9 | export const ChipContainer = styled('div')(({ theme }) => ({ 10 | marginTop: 12, 11 | marginBottom: 12, 12 | width: '100%' 13 | })) 14 | 15 | export const SpacedChip = styled(Chip)(({ theme }) => ({ 16 | marginRight: theme.spacing(1), 17 | marginBottom: theme.spacing(1) 18 | })) 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/switchers/language-switcher/language-switcher.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import LanguageSwitcher from './language-switcher' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Switchers/LanguageSwitcher', 6 | component: LanguageSwitcher 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | completed: true, 15 | onSwitchLang: () => {}, 16 | userCurrentLanguage: 'en', 17 | user: {} 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/templates/base/private-base/private-base.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { AppBar, Grid, Container } from '@mui/material' 3 | 4 | export const RootGrid = styled(Grid)(() => ({ 5 | backgroundColor: '#F7F7F7' 6 | })) 7 | 8 | export const SecondaryBar = styled(AppBar)(({ theme }) => ({ 9 | backgroundColor: theme.palette.primary.light 10 | })) 11 | 12 | export const ContainerRoot = styled(Container)(({ theme }) => ({ 13 | padding: theme.spacing(4) 14 | })) 15 | 16 | export default { RootGrid, SecondaryBar, ContainerRoot } 17 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/filters/issue-status-filter/issue-status-filter.stories.tsx: -------------------------------------------------------------------------------- 1 | import type { Meta, StoryObj } from '@storybook/react' 2 | import IssueStatusFilter from './issue-status-filter' 3 | 4 | // /src/components/design-library/atoms/filters/status-filter/status-filter.stories.tsx 5 | 6 | const meta: Meta = { 7 | title: 'design-library/atoms/Filters/IssueStatus', 8 | component: IssueStatusFilter, 9 | args: {} 10 | } 11 | export default meta 12 | 13 | type Story = StoryObj 14 | 15 | export const Default: Story = {} 16 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/fields/country-field/country-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import CountryField from './country-field' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Inputs/Fields/CountryField', 6 | component: CountryField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | country: 'BR', 14 | completed: true 15 | } 16 | 17 | export const Loading = Template.bind({}) 18 | Loading.args = { 19 | country: 'BR', 20 | completed: false 21 | } 22 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/status/issue-status/issue-status.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import IssueStatus from './issue-status' 3 | 4 | export default { 5 | title: 'Design Library/Atoms/Status/IssueStatus', 6 | component: IssueStatus 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | status: 'open' 15 | } 16 | 17 | export const Closed = Template.bind({}) 18 | Closed.args = { 19 | // Add default props here 20 | status: 'closed' 21 | } 22 | -------------------------------------------------------------------------------- /frontend/src/containers/project-explorer.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | import { connect } from 'react-redux' 3 | import ExploreProjectsPage from '../components/areas/public/features/explore/pages/explore-projects-page' 4 | import { listProjects } from '../actions/projectActions' 5 | 6 | const mapStateToProps = (state) => ({ 7 | projects: state.projects 8 | }) 9 | 10 | const mapDispatchToProps = (dispatch, ownProps) => { 11 | return { 12 | listProjects: () => dispatch(listProjects()) 13 | } 14 | } 15 | 16 | export default connect(mapStateToProps, mapDispatchToProps)(ExploreProjectsPage) 17 | -------------------------------------------------------------------------------- /src/app/routes/organization.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | require('passport') 4 | require('../../modules/authenticationHelpers') 5 | require('../../models') 6 | const controllers = require('../controllers/organization') 7 | 8 | router.get('/list', controllers.listOrganizations) 9 | router.get('/fetch/:id', controllers.fetchOrganization) 10 | const secure = require('./secure') 11 | 12 | router.use(secure) 13 | router.post('/create', controllers.createOrganization) 14 | router.put('/update', controllers.updateOrganization) 15 | 16 | module.exports = router 17 | -------------------------------------------------------------------------------- /src/modules/assigns/assignExists.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | const Promise = require('bluebird') 3 | 4 | module.exports = Promise.method(function assignExists(assignAttributes) { 5 | return models.Assign.findOne({ 6 | where: { 7 | userId: assignAttributes.userId, 8 | TaskId: assignAttributes.taskId 9 | } 10 | }) 11 | .then((assign) => { 12 | if (!assign) return false 13 | return assign 14 | }) 15 | .catch((error) => { 16 | // eslint-disable-next-line no-console 17 | console.log(error) 18 | throw error 19 | }) 20 | }) 21 | -------------------------------------------------------------------------------- /src/modules/walletOrders/walletOrderList.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(async function walletListOrder(params) { 5 | const wallet = 6 | params.walletId && 7 | (await models.Wallet.findOne({ 8 | where: { 9 | id: params.walletId 10 | } 11 | })) 12 | 13 | if (!wallet) { 14 | return { error: 'No valid wallet' } 15 | } 16 | 17 | return models.WalletOrder.findAll({ 18 | where: { 19 | walletId: wallet.id 20 | }, 21 | order: [['id', 'DESC']] 22 | }) 23 | }) 24 | -------------------------------------------------------------------------------- /frontend/src/containers/info.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux' 2 | import Info from '../components/areas/public/features/welcome/components/Info' 3 | import { info } from '../actions/infoActions' 4 | 5 | const mapStateToProps = (state, ownProps) => { 6 | return { 7 | tasks: state.info.data.tasks, 8 | bounties: state.info.data.bounties, 9 | users: state.info.data.users 10 | } 11 | } 12 | 13 | const mapDispatchToProps = (dispatch, ownProps) => { 14 | return { 15 | info: () => dispatch(info()) 16 | } 17 | } 18 | 19 | export default connect(mapStateToProps, mapDispatchToProps)(Info) 20 | -------------------------------------------------------------------------------- /frontend/src/stories/Header.stories.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import { Header } from './Header' 4 | 5 | export default { 6 | title: 'Example/Header', 7 | component: Header, 8 | parameters: { 9 | // More on Story layout: https://storybook.js.org/docs/react/configure/story-layout 10 | layout: 'fullscreen' 11 | } 12 | } 13 | 14 | const Template = (args) =>
15 | 16 | export const LoggedIn = Template.bind({}) 17 | LoggedIn.args = { 18 | user: { 19 | name: 'Jane Doe' 20 | } 21 | } 22 | 23 | export const LoggedOut = Template.bind({}) 24 | LoggedOut.args = {} 25 | -------------------------------------------------------------------------------- /src/modules/orders/orderFetch.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(function orderFetch(orderParams) { 5 | return models.Order.findOne({ where: { id: orderParams.id }, include: models.User }) 6 | .then(async (data) => { 7 | return { 8 | source_id: data.source_id, 9 | currency: data.currency, 10 | amount: data.amount 11 | } 12 | }) 13 | .catch((error) => { 14 | // eslint-disable-next-line no-console 15 | console.log(error) 16 | return false 17 | }) 18 | }) 19 | -------------------------------------------------------------------------------- /src/modules/tasks/taskSolutionGet.js: -------------------------------------------------------------------------------- 1 | const Promise = require('bluebird') 2 | const models = require('../../models') 3 | 4 | module.exports = Promise.method(function taskSolutionGet(taskId, userId) { 5 | return models.TaskSolution.findOne({ 6 | where: { taskId: taskId, userId: userId } 7 | }) 8 | .then((data) => { 9 | if (!data) { 10 | return {} 11 | } 12 | 13 | return data 14 | }) 15 | .catch((err) => { 16 | // eslint-disable-next-line no-console 17 | console.log(err) 18 | 19 | throw new Error('COULD_NOT_GET_TASK_SOLUTION') 20 | }) 21 | }) 22 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/base/created-field/created-field.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { useIntl } from 'react-intl' 3 | import MomentComponent from 'moment' 4 | 5 | import messages from '../../../../../../../../messages/messages' 6 | 7 | const CreatedField = ({ createdAt }) => { 8 | const intl = useIntl() 9 | return ( 10 |
11 | {createdAt ? MomentComponent(createdAt).fromNow() : intl.formatMessage(messages.noDefined)} 12 |
13 | ) 14 | } 15 | 16 | export default CreatedField 17 | -------------------------------------------------------------------------------- /frontend/src/components/areas/public/features/profile/pages/profile-page.tsx: -------------------------------------------------------------------------------- 1 | import UserProfilePublicPage from 'design-library/pages/public-pages/user-profile-public-page/user-profile-public-page' 2 | import React from 'react' 3 | import { useParams } from 'react-router-dom' 4 | 5 | const ProfilePage = ({ user, searchUser, tasks, listTasks, filterTasks }) => { 6 | return ( 7 | 14 | ) 15 | } 16 | 17 | export default ProfilePage 18 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/issue-content/issue-content-placeholder.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Skeleton, Stack } from '@mui/material' 3 | 4 | const IssueContentPlaceholder = () => { 5 | return ( 6 | 7 | 8 | 9 | 10 | 11 | 12 | ) 13 | } 14 | export default IssueContentPlaceholder 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/lists/project-list/project-list-full/project-list-full.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Container } from '@mui/material' 3 | import ProjectCard from '../../../cards/project-card/project-card' 4 | 5 | export const StyledContainer = styled(Container)(({ theme }) => ({ 6 | backgroundColor: (theme as any).palette?.background?.dark, 7 | minHeight: '100%', 8 | paddingBottom: theme.spacing(3), 9 | paddingTop: theme.spacing(3) 10 | })) 11 | 12 | export const StyledProjectCard = styled(ProjectCard as any)({ 13 | height: '100%' 14 | }) 15 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/account/features/account-skills/my-skill.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Avatar, Chip } from '@mui/material' 3 | import { SkillIcon } from './skill-icon' 4 | 5 | const MySkill = (props) => { 6 | const { title, onDelete } = props 7 | 8 | return ( 9 | 12 | 13 | 14 | } 15 | label={title} 16 | onDelete={onDelete} 17 | style={{ marginRight: 5, justifyContent: 'space-between' }} 18 | /> 19 | ) 20 | } 21 | 22 | export default MySkill 23 | -------------------------------------------------------------------------------- /frontend/src/components/areas/private/features/payout-settings/pages/payout-settings-paypal-page.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PayoutSettingsPaypal from 'design-library/pages/private-pages/settings-pages/payout-settings-paypal/payout-settings-paypal' 3 | 4 | const PayoutSettingsPaypalPage = ({ user, updateUser }) => { 5 | const handlePaypalAccount = (e) => { 6 | e.preventDefault() 7 | updateUser({ 8 | paypal_id: e.target.paypal_email.value 9 | }) 10 | } 11 | 12 | return 13 | } 14 | export default PayoutSettingsPaypalPage 15 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/content/issue-content/issue-content.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Typography } from '@mui/material' 3 | 4 | export const DescriptionHeading = styled(Typography)(({ theme }) => ({ 5 | marginBottom: 10, 6 | marginTop: 20 7 | })) 8 | 9 | export const IssueContentText = styled(Typography)(({ theme }) => ({ 10 | marginBottom: 40, 11 | wordBreak: 'break-word', 12 | overflowWrap: 'break-word', 13 | '& a': { 14 | wordBreak: 'break-all' 15 | }, 16 | '& img': { 17 | maxWidth: '100%', 18 | height: 'auto' 19 | } 20 | })) 21 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/dialogs/bottom-section-dialog/bottom-section-dialog.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import BottomSectionDialog from './bottom-section-dialog' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Dialogs/BottomSectionDialog', 6 | component: BottomSectionDialog 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | header: 'header section', 15 | title: 'title', 16 | subtitle: 'subtitle', 17 | content: 'content' 18 | } 19 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/form-section/personal-details-form/personal-details.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import PersonalDetailsForm from './personal-details-form' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/FormSection/PersonalDetailsForm', 6 | component: PersonalDetailsForm 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | account: { 14 | completed: true, 15 | data: { 16 | first_name: 'John', 17 | last_name: 'Doe' 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/modules/paymentRequestsTransfers/paymentRequestsTransferList.js: -------------------------------------------------------------------------------- 1 | const models = require('../../models') 2 | 3 | module.exports = async function paymentRequestTransferList(paymentRequestTransferParams) { 4 | const paymentRequestTransferList = await models.PaymentRequestTransfer.findAll({ 5 | where: { 6 | userId: paymentRequestTransferParams.userId 7 | }, 8 | order: [['createdAt', 'DESC']], 9 | include: [ 10 | { 11 | model: models.User 12 | }, 13 | { 14 | model: models.PaymentRequest 15 | } 16 | ] 17 | }) 18 | return paymentRequestTransferList 19 | } 20 | -------------------------------------------------------------------------------- /.devcontainer/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | app: 4 | build: 5 | context: .. 6 | dockerfile: .devcontainer/Dockerfile 7 | volumes: 8 | - ..:/workspace:cached 9 | command: sleep infinity 10 | network_mode: service:db 11 | 12 | db: 13 | image: postgres:latest 14 | restart: unless-stopped 15 | environment: 16 | POSTGRES_USER: postgres 17 | POSTGRES_PASSWORD: postgres 18 | POSTGRES_DB: mydatabase 19 | ports: 20 | - "5432:5432" 21 | volumes: 22 | - postgres-data:/var/lib/postgresql/data 23 | 24 | volumes: 25 | postgres-data: 26 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/alerts/simple-info/simple-info.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | 3 | export const SimpleInfoRoot = styled('div')(({ theme }) => ({ 4 | paddingBottom: 10, 5 | display: 'flex', 6 | alignItems: 'center' 7 | })) 8 | 9 | export const IconCenter = styled('span')(({ theme }) => ({ 10 | verticalAlign: 'middle', 11 | paddingRight: 5, 12 | color: theme.palette.action.active 13 | })) 14 | 15 | export const Text = styled('p')(({ theme }) => ({ 16 | color: theme.palette.text.secondary, 17 | marginTop: 5, 18 | fontSize: 11, 19 | marginBottom: 0 20 | })) 21 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/atoms/inputs/radios/radios.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Radios from './radios' 3 | 4 | const options = [ 5 | { label: 'Option 1', value: '1' }, 6 | { label: 'Option 2', value: '2' }, 7 | { label: 'Option 3', value: '3' } 8 | ] 9 | 10 | export default { 11 | title: 'Design Library/Atoms/Inputs/Radios', 12 | component: Radios 13 | } 14 | 15 | export const Default = { 16 | render: (args) => { 17 | return {}} /> 18 | }, 19 | args: { 20 | name: 'example-radios' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/issue/issue-created-field/issue-created-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import IssueCreatedField from './issue-created-field' 3 | 4 | export default { 5 | title: 'Design Library/Molecules/Tables/Fields/Issue/IssueCreatedField', 6 | component: IssueCreatedField 7 | } 8 | 9 | const Template = (args) => 10 | 11 | export const Default = Template.bind({}) 12 | Default.args = { 13 | // Add default props here 14 | issue: { 15 | createdAt: '2021-07-01T00:00:00.000Z' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/tables/section-table/section-table-custom-fields/payment-request/payment-request-active-field/payment-request-active-field.stories.tsx: -------------------------------------------------------------------------------- 1 | import PaymentRequestActiveField from './payment-request-active-field' 2 | 3 | const meta = { 4 | title: 'Design Library/Molecules/Tables/Fields/PaymentRequest/PaymentRequestActiveField', 5 | component: PaymentRequestActiveField, 6 | args: { 7 | status: 'open' 8 | } 9 | } 10 | 11 | export const Yes = { 12 | args: { 13 | status: 'Yes' 14 | } 15 | } 16 | 17 | export const No = { 18 | args: { 19 | status: 'No' 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/models/projectProgrammingLanguage.js: -------------------------------------------------------------------------------- 1 | module.exports = (sequelize, DataTypes) => { 2 | const ProjectProgrammingLanguage = sequelize.define('ProjectProgrammingLanguage', { 3 | projectId: { 4 | type: DataTypes.INTEGER, 5 | allowNull: false, 6 | references: { 7 | model: 'Projects', 8 | key: 'id' 9 | } 10 | }, 11 | programmingLanguageId: { 12 | type: DataTypes.INTEGER, 13 | allowNull: false, 14 | references: { 15 | model: 'ProgrammingLanguages', 16 | key: 'id' 17 | } 18 | } 19 | }) 20 | 21 | return ProjectProgrammingLanguage 22 | } 23 | -------------------------------------------------------------------------------- /frontend/.storybook/utils/generateTableData.ts: -------------------------------------------------------------------------------- 1 | type TableRow = { 2 | id: number 3 | name: string 4 | email: string 5 | role: string 6 | status: string 7 | action: string 8 | other: string 9 | } 10 | 11 | export const generateTableData = (count: number): TableRow[] => { 12 | const data: TableRow[] = [] 13 | for (let i = 0; i < count; i++) { 14 | data.push({ 15 | id: i + 1, 16 | name: `John Doe ${i + 1}`, 17 | email: `john${i}@gmail.com`, 18 | role: 'Contributor', 19 | status: 'Active', 20 | action: 'Edit', 21 | other: 'Other' 22 | }) 23 | } 24 | return data 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/components/design-library/molecules/cards/balance-card/balance-card.styles.ts: -------------------------------------------------------------------------------- 1 | import { styled } from '@mui/material/styles' 2 | import { Card as MuiCard, Typography as MuiTypography } from '@mui/material' 3 | 4 | export const RootCard = styled(MuiCard)(({ theme }) => ({ 5 | maxWidth: 500, 6 | margin: 10, 7 | textAlign: 'right', 8 | padding: 10 9 | })) 10 | 11 | export const Balance = styled(MuiTypography)(() => ({ 12 | fontSize: 32, 13 | fontWeight: 'bold' 14 | })) 15 | 16 | export const Name = styled(MuiTypography)(() => ({ 17 | fontSize: 18 18 | })) 19 | 20 | export default { RootCard, Balance, Name } 21 | --------------------------------------------------------------------------------