{"id":13473512,"url":"https://github.com/Oztechan/CCC","last_synced_at":"2025-03-26T19:34:22.273Z","repository":{"id":37037254,"uuid":"102633334","full_name":"Oztechan/CCC","owner":"Oztechan","description":"💰 Currency Converter Calculator for Android, iOS and Backend with power of Kotlin Multiplatform :muscle:","archived":false,"fork":false,"pushed_at":"2024-10-29T22:32:16.000Z","size":55737,"stargazers_count":332,"open_issues_count":19,"forks_count":30,"subscribers_count":9,"default_branch":"develop","last_synced_at":"2024-10-30T00:45:01.447Z","etag":null,"topics":["android","buildsrc","combine","coroutines","ios","kmp","kotlin","kotlin-dsl","kotlin-multi-platform","kotlin-multiplatform","kotlin-multiplatform-mobile","ktor","multimodule","multiplatform","mvvm","sqldelight","stateflow","submodules","swiftui","viewbinding"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Oztechan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-09-06T16:39:51.000Z","updated_at":"2024-10-29T22:38:23.000Z","dependencies_parsed_at":"2024-03-17T01:20:52.218Z","dependency_job_id":"906d7fb7-2e98-4184-85ff-0aa5be63b358","html_url":"https://github.com/Oztechan/CCC","commit_stats":null,"previous_names":[],"tags_count":79,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oztechan%2FCCC","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oztechan%2FCCC/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oztechan%2FCCC/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oztechan%2FCCC/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Oztechan","download_url":"https://codeload.github.com/Oztechan/CCC/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245722847,"owners_count":20661835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","buildsrc","combine","coroutines","ios","kmp","kotlin","kotlin-dsl","kotlin-multi-platform","kotlin-multiplatform","kotlin-multiplatform-mobile","ktor","multimodule","multiplatform","mvvm","sqldelight","stateflow","submodules","swiftui","viewbinding"],"created_at":"2024-07-31T16:01:04.332Z","updated_at":"2025-03-26T19:34:17.240Z","avatar_url":"https://github.com/Oztechan.png","language":"Kotlin","readme":"\u003ch1 align=\"center\"\u003eCurrency Converter \u0026 Calculator\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n\nA currency converter application for most of the currencies used in the world.\n\nYou can quickly convert and make mathematical operations between currencies.\n\n\u003ca href=\"https://play.google.com/store/apps/details?id=mustafaozhan.github.com.mycurrencies\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/play_store.png?raw=true\" width=\"175px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://apps.apple.com/us/app/currency-converter-calculator/id1617484510\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/app_store.png?raw=true\" width=\"175px\"\u003e\u003c/a\u003e\n\u003ca href=\"https://appgallery.huawei.com/app/C104920917\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/appgallery.png?raw=true\" width=\"175px\"\u003e\u003c/a\u003e\n\n\u003ca href=\"https://github.com/Oztechan/CCC/actions/workflows/main.yml\"\u003e\u003cimg src=\"https://github.com/CurrencyConverterCalculator/CCC/workflows/CCC%20CI/badge.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://www.codacy.com/gh/Oztechan/CCC/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=CurrencyConverterCalculator/CCC\u0026amp;utm_campaign=Badge_Grade\"\u003e\u003cimg src=\"https://app.codacy.com/project/badge/Grade/2196f4447c32431b80d582a21ad749db\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://codecov.io/gh/Oztechan/CCC\"\u003e\u003cimg src=\"https://codecov.io/gh/Oztechan/CCC/branch/develop/graph/badge.svg?token=Lenq2MZgM7\"/\u003e\u003c/a\u003e\n\u003ca href=\"https://www.codacy.com/gh/Oztechan/CCC/dashboard?utm_source=github.com\u0026amp;utm_medium=referral\u0026amp;utm_content=CurrencyConverterCalculator/CCC\u0026amp;utm_campaign=Badge_Coverage\"\u003e\u003cimg src=\"https://app.codacy.com/project/badge/Coverage/2196f4447c32431b80d582a21ad749db\"/\u003e\u003c/a\u003e\n\n\u003ca href=\"https://github.com/Oztechan/CCC/commits/develop\"\u003e\u003cimg src=\"https://img.shields.io/github/last-commit/Oztechan/CCC?label=Last%20commit\u0026color=blue\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Oztechan/CCC/pulls?q=is%3Apr+is%3Aopen\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-pr-raw/Oztechan/CCC?label=Open%20PR\u0026color=green0light\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Oztechan/CCC/pulls?q=is%3Apr+is%3Aclosed\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-pr-closed-raw/Oztechan/CCC?label=Closed%20PR\u0026color=white\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Oztechan/CCC/issues?q=is%3Aopen\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-raw/Oztechan/CCC?label=Open%20Issue\u0026color=green-light\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/Oztechan/CCC/issues?q=is%3Aclosed\"\u003e\u003cimg src=\"https://img.shields.io/github/issues-closed-raw/Oztechan/CCC?label=Closed%20Issue\u0026color=white\"\u003e\u003c/a\u003e\n\n\u003ca href='https://ko-fi.com/B0B2TZMH' target='_blank'\u003e\u003cimg height='36' style='border:0px;height:36px;' src='https://az743702.vo.msecnd.net/cdn/kofi1.png?v=2' border='0' alt='Buy Me a Coffee at ko-fi.com' /\u003e\u003c/a\u003e\n\n\u003c/div\u003e\n\n## Modularization\n\n```mermaid\ngraph TD;\n\n    client--\u003eandroid(android)\n    client--\u003eios(ios)\n\n    common--\u003eclient\n    common--\u003ebackend(backend)\n    \n    submodule{submodule}\n\n    test\n```\n\nAll the modules in the project are grouped into 6 targets:\n\n- `android`, `ios` and `backend` are app modules that contains platform only codes\n- `client` is a KMM module that shared between `ios` and `android`.\n- `common` is a KMP modules that shared between all the platforms (`android`, `ios` and `backend`)\n- `submodule` these are different git repositories and can be used in any of these modules. (arrows are not shown for the sake of simplicity)\n- `test` contains test cases for architecture and coding conventions\n\n## How to clone\n\nThe project uses submodules, please clone it as below:\n\n```shell\ngit clone https://github.com/CurrencyConverterCalculator/CCC.git \u0026\u0026\ncd CCC \u0026\u0026\ngit submodule update --init --recursive\n```\n\nSubmodules:\n\n- [LogMob](https://github.com/SubMob/LogMob) KMP logging library with Crashlytics support\n- [ScopeMob](https://github.com/SubMob/ScopeMob) Useful set of Kotlin scope functions with KMP support\n- [BaseMob](https://github.com/SubMob/BaseMob) Android base classes\n- [ParserMob](https://github.com/SubMob/ParserMob) KMP parsing library\n\n## How to run\n\nBe sure that you have latest Android Studio Canary build installed and XCode 13.0 or later.\n\n### Android\n\nOpen CCC folder with Android Studio and select `android:app` from configurations and run\n\n### iOS\n\nOpen `CCC/ios/CCC.xcworkspace` with XCode after the packages are resolved you can run the project. Generally you should use the latest stable XCode version.\n\n### Backend\n\n```shell\n./gradlew :backend:run\n```\n\n## Testing\n\nAfter you run the app probably your all API calls will fail, it is expected since the private URLs are not shared publicly. If you want the test the app with real API calls, I have prepared a fake response. Please replace all the `getConversion` methods in\n\n- `com.oztechan.ccc.common.core.network.api.backend.BackendApiImpl`\n- `com.oztechan.ccc.common.core.network.api.premium.PremiumApiImpl`\n\nwith below;\n\n```kotlin\noverride suspend fun getConversion(base: String): ExchangeRate = client.get {\n    url {\n        takeFrom(\"https://gist.githubusercontent.com/mustafaozhan/fa6d05e65919085f871adc825accea46/raw/d3bf3a7771e872e0c39541fe23b4058f4ae24c41/response.json\")\n    }\n}.body()\n```\n\n## Architecture\n\n```mermaid\ngraph TD;\n    subgraph Backend[Backend]\n        database(database) --\u003e datasource\n        api(api) --\u003e service\n    \n        datasource --\u003e Controller\n        service --\u003e Controller\n    \n        Controller --\u003e App\n    end\n    \n    subgraph Mobile[Mobile]\n        Persistence(Persistence) --\u003e Storage\n        Database(Database) --\u003e DataSource\n    \n        API(API) --\u003e Service\n        RemoteConfig(RemoteConfig) --\u003e ConfigService\n    \n        Storage --\u003e ViewModel\n        DataSource --\u003e ViewModel\n    \n        Repository --\u003e ViewModel\n    \n        Storage --\u003e Repository\n        DataSource --\u003e Repository\n        Service --\u003e Repository\n        ConfigService --\u003e Repository\n    \n        Service --\u003e ViewModel\n        ConfigService --\u003e ViewModel\n    \n        ViewModel --\u003e Views\n    end\n```\n\n## Android Preview\n\n\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/1.png\" width=\"400px\"/\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/2.png\" width=\"320px\"/\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/3.png\" width=\"400px\"/\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/4.png\" width=\"400px\"/\u003e\n\n\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/5.png\" width=\"400px\"/\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/6.png\" width=\"400px\"/\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/7.png\" width=\"400px\"/\u003e\u003cimg src=\"https://raw.githubusercontent.com/CurrencyConverterCalculator/CCC/develop/art/android/6.png\" width=\"400px\"/\u003e\n\n## iOS Preview\n\n\u003cimg src=\"https://github.com/CurrencyConverterCalculator/CCC/blob/develop/art/ios/dark.gif?raw=true\" width=\"400px\"/\u003e \u003cimg src=\"https://github.com/CurrencyConverterCalculator/CCC/blob/develop/art/ios/light.gif?raw=true\" width=\"400px\"/\u003e\n\n## Included Currencies\n\n[![currencies.png](https://github.com/CurrencyConverterCalculator/CCC/raw/develop/art/currencies.png)](https://github.com/CurrencyConverterCalculator/CCC/raw/develop/art/currencies.png)\n\n## License\n\n```text\nCopyright 2017 Mustafa Ozhan\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```","funding_links":["https://ko-fi.com/B0B2TZMH'"],"categories":["Kotlin"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOztechan%2FCCC","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FOztechan%2FCCC","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FOztechan%2FCCC/lists"}