# API naming convention **Currently, for all request we are dropping `get` from the name. This convention require further discussion.** For e.g., ##### Convention 1 ```graphql= query { pie(id: String!) { createdAt: String investedAmount: Float investments: [Investment] name: String pieId: String status: String } } ``` ##### Convention 2 ```graphql= query { getPie(id: String!) { createdAt: String investedAmount: Float investments: [Investment] name: String pieId: String status: String } } ``` We are using **Convention [1](#Convention-1)**. We can go with either one. ## For getting list or all data #### Convention 1 ```graphql= query { pies { quotes: [Quote!] } } ``` #### Convention 2 ```graphql= query { allPies { quotes: [Quote!] } } ``` #### Convention 3 ```graphql= query { listPies { quotes: [Quote!] } } ``` We are using **Convention [1](#Convention-11)** for this case right now. ***Needs confirmation so that both teams can be on common page.*** ## Current API Schema > The `userId` will be grabbed from the `Authorization` header if it is set. ```graphql= { "Authorization": "Bearer <token received>" } ``` ### Login with Phone Number It is two step process. ```graphql= mutation loginWithPhoneNumber( prefix: String @optional phoneNumber: String! ) { token: String } ``` > `token` is essential to confirm the login #### Verify Phone Number login ```graphql= mutation verifyPhoneNumber( token: String! # received while loginWithPhoneNumber mutation code: String! # otp code ) { token: String # jwt token refreshToken: String # refresh token (save it securely) expiresAt: String # when will token expire type: String # which auth type to use. E.g., bearer } ``` > `token` is essential to validate the login, we need to confirm that device which requested the login is the same one. ### Login with Username **Note: `loginWithUsername` makes more sense. Since, username is default for login in our app.** ```graphql= mutation loginWithUsername( username: String! password: String! ) { token: String # jwt token refreshToken: String # refresh token (save it securely) expiresAt: String # when will token expire type: String # which auth type to use. E.g., bearer } ``` > `username` can be username or email ### Verify Email ```graphql= mutation verifyEmail(code: String!) { ok: String! # ok denotes the status of email updation } ``` ## Forgot Password ```graphql= mutation forgotPassword(username: String!) { token: String! # essential to validate and update password for requested user } ``` > `username` can be username or email **Note: Should we make it generic or use two mutations?** In case of generic mutation ```graphql= mutation updatePassword( token: String @required if user is not logged in code: String @required if user is not logged in password: String! ) { ok: Boolean } ``` Using the above mutation to set password for `mutation forgotPassword` ```graphql= mutation updatePassword( $token: String!, $code: String!, $password: String! ){ updatePassword( token: $token, code: $code, password: $password ) { ok: Boolean } } ``` Using the above mutation to set password for logged in user. ```graphql= mutation updatePassword( $password: String! ){ updatePassword( password: $password ) { ok: Boolean } } ``` ## Sign up ```graphql= mutation signUpWithPhoneNumber( prefix: String @optional phoneNumber: String! ) { expiresAt: String refreshToken: String token: String type: String } ``` ```graphql= mutation verifyPhoneNumber(code: String!) { ok: Boolean } ``` ```graphql= mutation resendPhoneNumberVerificationCode( prefix: String @optional phoneNumber: String! channel: PhoneChannelEnum ) { token: String } ``` ```graphql= enum PhoneChannelEnum { sms call } ``` ## NOTE: Code below has not been updated to match the current schema Some queries and mutation requires to be updated according the naming scheme. Please refer [API Naming Convention](#API-naming-convention). As for updating all the schema is tedious and error prone. It also defeats the purpose of using GraphQL. Please check [Flahmingo's Playground]( https://flahmingo.ferb.win/playground) ## What does this mean? updateProfile or something? **Note: Requires clarification** ```graphql= mutation chooseUser($idUser: User!, $dataAccount: DataAccount!) { chooseUser(user: $idUser, dataAccount: $dataAccount) { username firstName lastName } } ``` ## Setup Account and Security **Note: Requires clarification** ``` mutation chooseUser($idUser: User!, $dataAccount: DataAccount!) { setupAccount(user: $idUser, dataAccount: $dataAccount) { email } ``` ## Onboarding Questions **Note: Require list of questions so we can make it more simpler.** ``` mutation howDoYouWantToUseFlahmingo($idUser: User!, $answer: Answer!){ howDoYouWantToUseFlahmingo(user: $idUser, answer: $answer){ answer } } ``` ``` howDoYouWantToUseFlahmingo{ question type options } ``` ## ## Pies ``` mutation CreatePieforUser($idUser: User!, $stocks: StocksSelected!) { createPie(user: $idUser, stocks: $stocks) { stockSymbol percentage } } ``` ``` pieProjection{ profitValue graphValue{ value } } ``` > PD: this graph show the stocks weighted average ``` pieDetail{ id name totalInvested valueVariation stocks{ stockSymbol stockName color stockImage{ publicURL name } percentage shares amountInvested currentPrice variationPrice graphValues{ value } } } ``` ## Explore and Select Stocks ``` allStocks{ stockSymbol stockName stockImage{ publicURL name } currentPrice variationPrice category } ``` ## Stock Detail ``` stockDetail(stockSymbol: “{eq: "APPL"}”) { stockSymbol stockName about stockImage currentPrice variationPrice category stats{ openPrice priceToEarningsRatio marketCap oneYearHighPrice oneYearLowPrice volumenTrading dividendYield highestDay lowestDay } } ``` ``` stockGraph(stockSymbol: “{eq: “APPL”}”, rangeType: ”{eq: “day”}” ){ stockSymbol rangeType highPrice lowPrice graphValues{ value date } } ``` ``` stockNews{ id sourceName publishedDate title url image{ publicURL name } } ``` ``` eventsStock{ stockSymbol nameEvent description typeEvent } ``` ## Trading ``` > mutation buyStock($idUser: User!, $pie: Pie!, $stock: Stock!) { buyStock(user: $idUser, pie: $pie stock: $stock) { stockSymbol shares priceOrder typeOrder } } ``` ``` balanceAccount{ cashBalance{ available currency } account{ type stocks{ stockSymbol shares } } } ``` ``` quotationBuyStock{ stockSymbol marketPrice pricePerShare EstimatedCost datetime } ``` ``` mutation sellStock($idUser: User!, $pie: Pie!, $stock: Stock!) { sellStock(user: $idUser, pie: $pie stock: $stock) { stockSymbol shares priceOrder typeOrder } } ``` ``` quotationSellStock{ stockSymbol pricePerShare marketPrice estimatedValue datetime } ``` ## Dashboard ``` allPies{ id name status totalInvested variationValue color createdAt stocks{ stockSymbol } graphPerformance{ value } } ``` ``` allEvents{ stockSymbol nameEvent description typeEvent } ``` ``` history{ orderNumber price stockSymbol shares currentStatus logStatus{ status modifiedAt } submittedAt } ``` ## Flamingo Central - [ ] Pending because this feature is not defined completely ## Ask Questions ``` allQuestions{ stockSymbol stockEventName createdAt status questions{ question answer shares votes } } ``` ``` mutation askQuestion($idUser: User!, $stock: Stock!, $question: Question!) { askQuestion(user: $idUser, stock: $stock, question: $question) { stockSymbol question } } ``` ``` availableQuestions{ stockSymbol available } ``` ## Settings - [ ] Pending because this feature is not defined completely ## KYC Basic Data ``` mutation basicData($idUser: User!, $basicData: BasicData!) { basicData(user: $idUser, basicData: $basicData) { birhtdate citizenship gender residentialAddress mailingAddress } } ``` ``` questionBasicData{ question type options } ``` ## KYC Employement Data ``` mutation employementData($idUser: User!, $employementData: EmployementData!) { employementData(user: $idUser, employementData: $employementData) { ocupation companyName companyType jobTitle socialInsuranceNumber } } ``` ``` questionEmployementData{ question type options } ``` ## KYC Financial Data ``` mutation financialData($idUser: User!, $financialData: FinancialData!) { financialData(user: $idUser, financialData: $financialData) { goals investingExperience annualIncome cashLiquidInvestments questionsAboutYouAndFamilyMembers } } ``` ``` questionsFinancialData{ question type options } ``` ## KYC Review and send data ``` mutation howDidYouHearAboutUs($idUser: User!, $answer: Answer!){ howDidYouHearAboutUs(user: $idUser, answer: $answer){ answer } } ``` ``` howDidYouHearAboutUs{ question type options } ``` ## Funding account & Paild ``` hypotheticalEarnings{ earnings totalInvestment totalReturn graphValues{ total investment return year } } ``` ``` mutation BankAccountLinked($idUser: User!, $accounts: Accounts!){ token bank type endingNumbers balance transactions{ amount description date } } ``` >>> Maybe the token is enough and the backend can retrieve the rest of data ``` allBankAccountsLinked{ bank type endingNumbers balance transactions{ amount description date } } ``` ``` allBanks{ code name image{ publicURL name } } ``` ## Notification ``` allNotifications{ title description datetime deeplink image{ publicURL name } } ``` ## Voting ``` mutation vote($idUser: User!, $vote: Vote!) { vote(user: $idUser, vote: $vote) { proposal vote } } ``` ``` allVotingProposals{ id stockSymbol event description type options{ value } } ``` ## Referall - [ ] Pending to define designs <!--stackedit_data: eyJoaXN0b3J5IjpbLTM0MjMwMjk2MywxMTQ2MzI1ODM1XX0= -->