- See the requirements page: https://developer.youcan.shop/apps/embedded_app/getstarted#requirements
- Runing MySQL server: starting from version 5.7.8 (recomended latest)
- Clone the repo
- Create empty MYSQL database
- Copy
.env.example
into a.env
file and fill its own values cd
into the project- Run
pnpm install
to install the dependencies - Run
youcan auth login
to authenticate with YouCan - Run
pnpm prisma migrate dev
to generate the database and its tables - Run
youcan app install
to install the app on your dev store. - Run
pnpm dev
to start the project and sync your settings with your partners app settings
youcan google sheet is a partner embedded app utilize
google service and youcan service to:
create, update, delete, sync orders
to the parner Google Spread Sheets using its own OAuth2 Credentials
- Service Layer : Bussiness logic
- Repository Layer : DB logic
- Types
- Validator
- Schemas : Validation Schemas
- Handler : (Response, Async, Sync, Catcher) and Error Handling
![](https://private-user-images.githubusercontent.com/61375797/329509122-8ae26b37-e958-427c-8330-ba9de60edfa5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5NTI2ODYsIm5iZiI6MTczOTk1MjM4NiwicGF0aCI6Ii82MTM3NTc5Ny8zMjk1MDkxMjItOGFlMjZiMzctZTk1OC00MjdjLTgzMzAtYmE5ZGU2MGVkZmE1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE5VDA4MDYyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWFiMDEyM2ZmNDU1NTUxMGQxYzU3OTdhZThkYmE5ZjUyYmE4OTdkNjZkMjhjZjQwN2QzODFhNGVjMzM5MDYwNDUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.gVgxoJmHmKbH4RNRgtGGfCWqtPBz7uU_hjEb9D7Y76Q)
- Assets: Css
- Components
- Composables : Reusable Logic
- Layouts
- Pages
- Public: static Imgs
- Types
![](https://private-user-images.githubusercontent.com/143792300/329608903-fb275cba-0002-42bb-bed7-6eafc2b610a0.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5NTI2ODYsIm5iZiI6MTczOTk1MjM4NiwicGF0aCI6Ii8xNDM3OTIzMDAvMzI5NjA4OTAzLWZiMjc1Y2JhLTAwMDItNDJiYi1iZWQ3LTZlYWZjMmI2MTBhMC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjE5JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxOVQwODA2MjZaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00M2I3NWIxZWVlODZiN2IxOGEwMWMxZjc1NjM0OWVhNGUzMTA2ZTM0ZWU2MWVhYmFkZTkwOTQ1NjBlZjJiODdmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.vNSl5tI2hY1SdNyq6hR9cJ-MngL3YZQsKKrJf75vHTQ)
![](https://private-user-images.githubusercontent.com/61375797/329510560-acc5a924-4217-4d6c-a6ac-8ba97d175b60.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5NTI2ODYsIm5iZiI6MTczOTk1MjM4NiwicGF0aCI6Ii82MTM3NTc5Ny8zMjk1MTA1NjAtYWNjNWE5MjQtNDIxNy00ZDZjLWE2YWMtOGJhOTdkMTc1YjYwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE5VDA4MDYyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTM4ODQ0YzAyMTBkMjRjNzllOGQ1MWM2MzI0MWE4ZjM4NzJmNmQ4ZmE1ZGY4Y2IyYjRiM2NmN2YwOWE4MmMyZmUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.0reRxccScc_yep9p7vvHqCT_RgSttt_7kK_LEbM3sVk)
both frontend and backend is decoupled
- frontend: based on nuxt
- backend: based on nitroJS
- they can be (separated/attached at same time) :
- separated to microServices
- attached and share something like: error state (useError, sendError) acc to the below pic
- Example: 1- useApi.getSetting() #frontend => "/setting/" #serverRoute 2- "/server/route/setting/index.get" #serverRoute => settingService.get() #service 3- settingService.get() #service => /server/composables/settingRepository.get() #repository
![](https://private-user-images.githubusercontent.com/61375797/329520753-19a79135-94fd-4e87-9bdd-834c27ab7223.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5NTI2ODYsIm5iZiI6MTczOTk1MjM4NiwicGF0aCI6Ii82MTM3NTc5Ny8zMjk1MjA3NTMtMTlhNzkxMzUtOTRmZC00ZTg3LTliZGQtODM0YzI3YWI3MjIzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE5VDA4MDYyNlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZhYTEyNjg3MGEwMDRkODJkYTQ1MmZkNGFlY2ViOGViYTdhN2E4YzE3N2I2N2YyMDkzYWViNjM2ZTc3ZTQyZjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.rMmAv0gGrwBFrjKogWhm-58vni5tCrJ_9_ziWP1-ml0)
-
Service Communicate to each others using
mediatorService
its an event => listener dynamic method dispatcher instead ofObserver
Service (not easy to be tracked by developers) example: oncegoogleService
authClient()
failed it should tillSettingService
todisconnect()
current OAuth2Client Credentials
- mediatorService
same as nuxt response
{
"statusCode": number,
"statusMessage": string,
"data": any,
"stack": [] //error stack empty if debug is disabled
}
available Status/Http codes:
- 422: unprocessable entity (validation)
- 401: unauthenticated
- 404: not found
- 200: success
- 500: internal server (global error)