From 85c3ff497aba714bd65c0b96bc50920ef9528b73 Mon Sep 17 00:00:00 2001 From: pnguyen215 Date: Sat, 23 Sep 2023 10:27:19 +0700 Subject: [PATCH] :recycle: refactor: updated codebase and README.md #14 --- README.md | 213 +--------------------- assets/.gitkeep | 0 assets/go-package-layout-example.png.webp | Bin 28534 -> 0 bytes docs/.gitkeep | 0 pkg/ami/data/ami_console_command.json | 1 - 5 files changed, 9 insertions(+), 205 deletions(-) delete mode 100644 assets/.gitkeep delete mode 100644 assets/go-package-layout-example.png.webp delete mode 100644 docs/.gitkeep delete mode 100644 pkg/ami/data/ami_console_command.json diff --git a/README.md b/README.md index 23fc60a..c39667b 100644 --- a/README.md +++ b/README.md @@ -1,211 +1,16 @@ -# Library Golang VOIP Core +# GobaseVoipCore -This is a basic VOIP core by [Golang](https://go.dev/) +The Asterisk VOIP library, implemented in the Go programming language (Golang), is a versatile and powerful tool for building robust voice over IP (VOIP) communication systems. Leveraging the efficiency and concurrency of Golang, this library enables developers to create scalable and high-performance VOIP applications with ease. -### Documentation +Asterisk in Golang provides a wide range of features, including call routing, real-time call control, voice recording, and support for various VOIP protocols. Its modular architecture allows for customization and integration with other systems and services, making it suitable for diverse applications, from call centers to telemedicine platforms. -- [Asterisk Manager Interface (AMI)](https://github.com/pnguyen215/gobase-voip-core/blob/master/docs/ami.md) - -### Go Directories - -/cmd -- This folder contains the main application entry point files for the project, with the directory name matching the name for the binary. -- Don't put a lot of code in the application directory. If you think the code can be imported and used in other projects, then it should live in the `/pkg` directory. If the code is not reusable or if you don't want others to reuse it, put that code in the `/internal` directory. You'll be surprised what others will do, so be explicit about your intentions! -- It's common to have a small main function that imports and invokes the code from the /internal and /pkg directories and nothing else. - -/pkg -- This folder contains code which is OK for other services to consume, this may include API clients, or utility functions which may be handy for other projects but don’t justify their own project. -- The pkg directory origins: The old Go source code used to use pkg for its packages and then various Go projects in the community started copying the pattern - -/internal -- This package holds the private library code used in your service, it is specific to the function of the service and not shared with other services. -- You can optionally add a bit of extra structure to your internal packages to separate your shared and non-shared internal code. It's not required (especially for smaller projects), but it's nice to have visual clues showing the intended package use. Your actual application code can go in the `/internal/app` directory (e.g., `/internal/app/myapp`) and the code shared by those apps in the `/internal/pkg` directory (e.g., `/internal/pkg/myprivlib`). - -/vendor -- Application dependencies (managed manually or by your favorite dependency management tool like the new built-in Go Modules feature). The go mod vendor command will create the /vendor directory for you. Note that you might need to add the -mod=vendor flag to your go build command if you are not using Go 1.14 where it's on by default. -- Don't commit your application dependencies if you are building a library. - -/api -- OpenAPI/Swagger specs, JSON schema files, protocol definition files. - -/web -- Web application specific components: static web assets, server side templates and SPAs. - -/configs -- Configuration file templates or default configs. Put your `confd` or `consul-template` template files here. - -/init -- System init (systemd, upstart, sysv) and process manager/supervisor (runit, supervisord) configs. - -/scripts -- Scripts to perform various build, install, analysis, etc operations. -- These scripts keep the root level Makefile small and simple (e.g., https://github.com/hashicorp/terraform/blob/master/Makefile). -- example: https://github.com/golang-standards/project-layout/blob/master/scripts/README.md - -/build -- Packaging and Continuous Integration. Put your cloud (AMI), container (Docker), OS (deb, rpm, pkg) package configurations and scripts in the `/build/package` directory. -- Put your CI (travis, circle, drone) configurations and scripts in the `/build/ci` directory. Note that some of the CI tools (e.g., Travis CI) are very picky about the location of their config files. Try putting the config files in the `/build/ci` directory linking them to the location where the CI tools expect them (when possible). - -/deployments -- IaaS, PaaS, system and container orchestration deployment configurations and templates (docker-compose, kubernetes/helm, mesos, terraform, bosh). Note that in some repos (especially apps deployed with kubernetes) this directory is called `/deploy`. +With Asterisk in Golang, developers benefit from the strengths of both the Golang language and the Asterisk ecosystem, resulting in reliable and efficient VOIP solutions that meet the demands of modern communication systems. -/docs -- Design and user documents (in addition to your godoc generated documentation). -- example: https://github.com/golang-standards/project-layout/blob/master/docs/README.md +### Usage -/tools -- Supporting tools for this project. Note that these tools can import code from the `/pkg` and `/internal` directories. -- example: https://github.com/golang-standards/project-layout/blob/master/tools/README.md - -/examples -- Examples for your applications and/or public libraries. -- refs: https://github.com/golang-standards/project-layout/blob/master/examples/README.md - -/assets -- Other assets to go along with your repository (images, logos, etc). - -go.mod -- The `go.mod` file defines the module's module path, which is also the import path used for the root directory, and its dependency requirements, which are the other modules needed for a successful build. - -go.sum -- The `go.sum` contains all the dependency check sums, and is managed by the go tools. The checksum present in go.sum file is used to validate the checksum of each of direct and indirect dependency to confirm that none of them has been modified. - -### Naming Convention - -- Package names should be lowercase. Don't use snake_case or camelCase. -- Avoid overly use terms like util, common, script etc -- Use singular form -```bash -fooApp/ - circle.yml - Dockerfile - cmd/ - foosrv/ - main.go - foocli/ - main.go - pkg/ - fs/ - fs.go - fs_test.go - mock.go - mock_test.go - merge/ - merge.go - merge_test.go - api/ - api.go - api_test.go -``` - -> As you noticed, there is func_test.go file in the same directory. In Go, you save unit tests inside separate files with a filename ending with _test.go. Go provides go test command out of the box which executes these files and runs tests. - - -### Example - -#### Go Directories - -``` -├── LICENSE -├── README.md -├── config.go -├── go.mod -├── go.sum -├── client-lib -│ ├── lib.go -│ └── lib_test.go -├── cmd -│ ├── mod-lib-client -│ │ └── main.go -│ └── mod-lib-server -│ └── main.go -├── internal -│ └── auth -│ ├── auth.go -│ └── auth_test.go -└── server-lib - └── lib.go -``` +- [Asterisk Manager Interface (AMI)](https://github.com/pnguyen215/gobase-voip-core/blob/master/docs/ami.md) -``` -$ tree exitus/ - exitus/ -├── cmd -│ ├── authtest -│ │ └── main.go -│ ├── backend -│ │ └── main.go -│ └── client -│ └── main.go -├── dev -│ ├── add_migration.sh -│ └── docker-compose.yml -├── Dockerfile -├── go.mod -├── go.sum -│ ├── 20190721131113_extensions.down.sql -│ ├── 20190721131113_extensions.up.sql -│ ├── 20190723044115_customer_projects.down.sql -│ ├── 20190723044115_customer_projects.up.sql -│ ├── 20190726175158_issues.down.sql -│ ├── 20190726175158_issues.up.sql -│ ├── 20190726201649_comments.down.sql -│ ├── 20190726201649_comments.up.sql -│ ├── bindata.go -│ ├── gen.go -│ ├── migrations_test.go -│ └── README.md -├── pkg -│ ├── api -│ │ ├── exitus.gen.go -│ │ ├── exitus.yml -│ │ └── gen.go -│ ├── auth -│ │ ├── scopes.go -│ │ └── user.go -│ ├── conf -│ │ ├── conf.go -│ │ └── conf_test.go -│ ├── db -│ │ ├── db.go -│ │ ├── dbtesting.go -│ │ ├── migrate.go -│ │ ├── sqlhooks.go -│ │ └── transactions.go -│ ├── env -│ │ └── env.go -│ ├── healthz -│ │ ├── healthz.go -│ │ └── healthz_test.go -│ ├── jwt -│ │ └── jwt.go -│ ├── metrics -│ │ └── metrics.go -│ ├── middleware -│ │ ├── jwt.go -│ │ └── middleware.go -│ ├── oidc -│ │ └── client.go -│ ├── server -│ │ ├── reflect.go -│ │ └── server.go -│ └── store -│ ├── comments.go -│ ├── comments_test.go -│ ├── customers.go -│ ├── customers_test.go -│ ├── issues.go -│ ├── issues_test.go -│ ├── migrate_test.go -│ ├── projects.go -│ ├── projects_test.go -│ └── store.go -└── README.md -``` +### Reference -#### Reference -* https://github.com/golang-standards/project-layout -* https://dev.to/jinxankit/go-project-structure-and-guidelines-4ccm -* https://www.developer.com/languages/go-project-layout/ -* https://www.wolfe.id.au/2020/03/10/how-do-i-structure-my-go-project/ -* https://github.com/onmyway133/awesome-voip/blob/master/README.md \ No newline at end of file +- [Asterisk Documentation](https://docs.asterisk.org) +- [Official Asterisk Repositories](https://github.com/asterisk/documentation) diff --git a/assets/.gitkeep b/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/assets/go-package-layout-example.png.webp b/assets/go-package-layout-example.png.webp deleted file mode 100644 index 5699cc6f2d1ea6cdf8d1a9e3806d5ec006c6bb9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28534 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%0Dfun;7so+=E` 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