Skip to content

Commit 9b0b386

Browse files
authored
Merge pull request #3 from linkartemy/develop
Merge: First Working Beta Version
2 parents 822bc0a + e0b44c0 commit 9b0b386

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2209
-2
lines changed

.clang-format

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
BasedOnStyle: google
2+
DerivePointerAlignment: false
3+
IncludeBlocks: Preserve

.clangd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
CompileFlags:
2+
Remove: [-static-libasan, -static-libsan]

.gitignore

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
__pycache__
2+
build*
3+
compile_commands.json
4+
.cache/
5+
.ccache/
6+
.idea/
7+
.vscode/
8+
!.vscode/c_cpp_properties.json
9+
!.vscode/cmake-variants.yaml
10+
!.vscode/README.md
11+
.cores/
12+
.devcontainer/
13+
.pgdata/
14+
cmake-build-*
15+
Testing/
16+
.DS_Store
17+
Makefile.local
18+
.vscode/
19+
config_vars*
20+
.pytest_cache
21+
*.pyc
22+
*.pyo
23+
*.pyd
24+
*.pyz
25+
*.pyw
26+
thirdparty/userver

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "third_party/userver"]
2+
path = third_party/userver
3+
url = https://github.com/userver-framework/userver.git

CMakeLists.txt

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
project(vpn_manager CXX)
3+
4+
# set(CMAKE_CXX_STANDARD 17)
5+
# set(CMAKE_CXX_STANDARD_REQUIRED ON)
6+
7+
# set(USERVER_FEATURE_POSTGRESQL ON CACHE BOOL "" FORCE)
8+
# set(USERVER_FEATURE_CRYPTOPP_BLAKE2 OFF CACHE BOOL "" FORCE)
9+
# set(USERVER_FEATURE_GRPC_CHANNELZ OFF CACHE BOOL "" FORCE)
10+
# set(USERVER_FEATURE_REDIS_HI_MALLOC ON CACHE BOOL "" FORCE)
11+
12+
# # Добавляем userver как поддиректорию
13+
# if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/userver")
14+
# message(STATUS "Using userver framework from third_party/userver")
15+
# add_subdirectory(third_party/userver)
16+
# else()
17+
# message(FATAL_ERROR "userver submodule is missing. Make sure to initialize it with `git submodule update --init --recursive`.")
18+
# endif()
19+
20+
# userver_setup_environment()
21+
22+
# add_library(${PROJECT_NAME}_objs OBJECT
23+
# src/constants.hpp
24+
25+
# src/models/user_dto.hpp
26+
# src/models/exception.hpp
27+
28+
# src/repositories/user_repository/user_repository.hpp
29+
# src/repositories/user_repository/user_repository.cpp
30+
31+
# src/handlers/v1/user/get-by-username/view.hpp
32+
# src/handlers/v1/user/get-by-username/view.cpp
33+
# )
34+
35+
# target_link_libraries(${PROJECT_NAME}_objs PUBLIC userver-core userver-postgresql)
36+
37+
# # Основной исполняемый файл
38+
# add_executable(${PROJECT_NAME} src/main.cpp)
39+
# target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_objs)
40+
41+
# # Поддержка тестов (если требуется)
42+
# userver_testsuite_add_simple()
43+
44+
# # Тестовый исполняемый файл
45+
# add_executable(${PROJECT_NAME}_unittest)
46+
# target_link_libraries(${PROJECT_NAME}_unittest PRIVATE ${PROJECT_NAME}_objs userver::utest)
47+
# add_google_tests(${PROJECT_NAME}_unittest)
48+
49+
# # Установка
50+
# include(GNUInstallDirs)
51+
52+
# if(DEFINED ENV{PREFIX})
53+
# message(STATUS "Set install prefix: $ENV{PREFIX}")
54+
# file(TO_CMAKE_PATH "$ENV{PREFIX}" PREFIX_PATH)
55+
# set(CMAKE_INSTALL_PREFIX ${PREFIX_PATH})
56+
# endif()
57+
58+
# # Установить конфигурационные файлы
59+
# file(GLOB CONFIGS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/configs/*.yaml ${CMAKE_CURRENT_SOURCE_DIR}/configs/*.json)
60+
# install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${PROJECT_NAME})
61+
# install(FILES ${CONFIGS_FILES} DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME} COMPONENT ${PROJECT_NAME})
62+
63+
64+
65+
66+
# OLD
67+
68+
# Adding userver dependency
69+
find_package(userver COMPONENTS core postgresql REQUIRED)
70+
if(NOT userver_FOUND) # Fallback to subdirectory usage
71+
# Enable userver libraries that are needed in this project
72+
set(USERVER_FEATURE_POSTGRESQL ON CACHE BOOL "" FORCE)
73+
74+
# Compatibility mode: some systems don't support these features
75+
set(USERVER_FEATURE_CRYPTOPP_BLAKE2 OFF CACHE BOOL "" FORCE)
76+
set(USERVER_FEATURE_GRPC_CHANNELZ OFF CACHE BOOL "" FORCE)
77+
set(USERVER_FEATURE_REDIS_HI_MALLOC ON CACHE BOOL "" FORCE)
78+
79+
if(EXISTS third_party/userver)
80+
message(STATUS "Using userver framework from third_party/userver")
81+
add_subdirectory(third_party/userver)
82+
else()
83+
message(FATAL_ERROR "Either install the userver or provide a path to it")
84+
endif()
85+
endif()
86+
87+
userver_setup_environment()
88+
89+
# Common sources
90+
add_library(${PROJECT_NAME}_objs OBJECT
91+
src/constants.hpp
92+
93+
src/helpers/email_helper.hpp
94+
src/helpers/email_helper.cpp
95+
src/helpers/phone_helper.hpp
96+
src/helpers/phone_helper.cpp
97+
src/helpers/datetime_helper.hpp
98+
src/helpers/datetime_helper.cpp
99+
src/helpers/string_convertible_checker.hpp
100+
101+
src/models/user_dto.hpp
102+
src/models/response.hpp
103+
104+
src/repositories/user_repository/user_repository.hpp
105+
src/repositories/user_repository/user_repository.cpp
106+
src/repositories/key_repository/key_repository.hpp
107+
src/repositories/key_repository/key_repository.cpp
108+
109+
src/handlers/v1/user/get-by-username/view.hpp
110+
src/handlers/v1/user/get-by-username/view.cpp
111+
src/handlers/v1/user/create-user/view.hpp
112+
src/handlers/v1/user/create-user/view.cpp
113+
114+
src/handlers/v1/key/create-key/view.hpp
115+
src/handlers/v1/key/create-key/view.cpp
116+
src/handlers/v1/key/get-by-id/view.hpp
117+
src/handlers/v1/key/get-by-id/view.cpp
118+
src/handlers/v1/key/get-by-name/view.hpp
119+
src/handlers/v1/key/get-by-name/view.cpp
120+
)
121+
target_link_libraries(${PROJECT_NAME}_objs PUBLIC userver::postgresql)
122+
123+
124+
# The Service
125+
add_executable(${PROJECT_NAME} src/main.cpp)
126+
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_objs)
127+
128+
target_include_directories(${PROJECT_NAME}
129+
PRIVATE
130+
${CMAKE_CURRENT_SOURCE_DIR}
131+
)
132+
133+
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
134+
135+
# Unit Tests
136+
add_executable(${PROJECT_NAME}_unittest)
137+
target_link_libraries(${PROJECT_NAME}_unittest PRIVATE ${PROJECT_NAME}_objs userver::utest)
138+
add_google_tests(${PROJECT_NAME}_unittest)
139+
140+
141+
# Benchmarks
142+
add_executable(${PROJECT_NAME}_benchmark)
143+
target_link_libraries(${PROJECT_NAME}_benchmark PRIVATE ${PROJECT_NAME}_objs userver::ubench)
144+
add_google_benchmark_tests(${PROJECT_NAME}_benchmark)
145+
146+
147+
# Functional Tests
148+
userver_testsuite_add_simple()
149+
150+
151+
# Install
152+
include(GNUInstallDirs)
153+
154+
if(DEFINED ENV{PREFIX})
155+
message(STATUS "Set install prefix: $ENV{PREFIX}")
156+
file(TO_CMAKE_PATH "$ENV{PREFIX}" PREFIX_PATH)
157+
set(CMAKE_INSTALL_PREFIX ${PREFIX_PATH})
158+
endif()
159+
160+
file(GLOB CONFIGS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/configs/*.yaml ${CMAKE_CURRENT_SOURCE_DIR}/configs/*.json)
161+
162+
install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${PROJECT_NAME})
163+
install(FILES ${CONFIGS_FILES} DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/${PROJECT_NAME} COMPONENT ${PROJECT_NAME})

Makefile

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
CMAKE_COMMON_FLAGS ?= -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
2+
3+
CMAKE_RELEASE_FLAGS ?=
4+
NPROCS ?= $(shell nproc)
5+
CLANG_FORMAT ?= clang-format
6+
DOCKER_COMPOSE ?= docker-compose
7+
8+
# NOTE: use Makefile.local to override the options defined above.
9+
-include Makefile.local
10+
11+
CMAKE_DEBUG_FLAGS += -DCMAKE_BUILD_TYPE=Debug $(CMAKE_COMMON_FLAGS)
12+
CMAKE_RELEASE_FLAGS += -DCMAKE_BUILD_TYPE=Release $(CMAKE_COMMON_FLAGS)
13+
14+
.PHONY: all
15+
all: test-debug test-release
16+
17+
# Run cmake
18+
.PHONY: cmake-debug
19+
cmake-debug:
20+
cmake -B build_debug $(CMAKE_DEBUG_FLAGS)
21+
22+
.PHONY: cmake-release
23+
cmake-release:
24+
cmake -B build_release $(CMAKE_RELEASE_FLAGS)
25+
26+
build_debug/CMakeCache.txt: cmake-debug
27+
build_release/CMakeCache.txt: cmake-release
28+
29+
# Build using cmake
30+
.PHONY: build-debug build-release
31+
build-debug build-release: build-%: build_%/CMakeCache.txt
32+
cmake --build build_$* -j $(NPROCS) --target vpn_manager
33+
34+
# Test
35+
.PHONY: test-debug test-release
36+
test-debug test-release: test-%: build-%
37+
cd build_$* && ((test -t 1 && GTEST_COLOR=1 PYTEST_ADDOPTS="--color=yes" ctest -V) || ctest -V)
38+
pycodestyle tests
39+
40+
# Start the service (via testsuite service runner)
41+
.PHONY: service-start-debug service-start-release
42+
service-start-debug service-start-release: service-start-%: build-%
43+
cmake --build build_$* -v --target start-vpn_manager
44+
45+
# Cleanup data
46+
.PHONY: clean-debug clean-release
47+
clean-debug clean-release: clean-%:
48+
cmake --build build_$* --target clean
49+
50+
.PHONY: dist-clean
51+
dist-clean:
52+
rm -rf build_*
53+
rm -rf tests/__pycache__/
54+
rm -rf tests/.pytest_cache/
55+
56+
# Install
57+
.PHONY: install-debug install-release
58+
install-debug install-release: install-%: build-%
59+
cmake --install build_$* -v --component vpn_manager
60+
61+
.PHONY: install
62+
install: install-release
63+
64+
# Format the sources
65+
.PHONY: format
66+
format:
67+
find src -name '*pp' -type f | xargs $(CLANG_FORMAT) -i
68+
find tests -name '*.py' -type f | xargs autopep8 -i
69+
70+
# Internal hidden targets that are used only in docker environment
71+
--in-docker-start-debug --in-docker-start-release: --in-docker-start-%: install-%
72+
psql 'postgresql://link:327z#[email protected]:5432/vpn_manager_db_1' -f ./postgresql/data/initial_data.sql
73+
/home/user/.local/bin/vpn_manager \
74+
--config /home/user/.local/etc/vpn_manager/static_config.yaml \
75+
--config_vars /home/user/.local/etc/vpn_manager/config_vars.docker.yaml
76+
77+
# Build and run service in docker environment
78+
.PHONY: docker-start-service-debug docker-start-service-release
79+
docker-start-service-debug docker-start-service-release: docker-start-service-%:
80+
$(DOCKER_COMPOSE) run -p 8080:8080 --rm vpn_manager-container make -- --in-docker-start-$*
81+
82+
# Start targets makefile in docker environment
83+
.PHONY: docker-cmake-debug docker-build-debug docker-test-debug docker-clean-debug docker-install-debug docker-cmake-release docker-build-release docker-test-release docker-clean-release docker-install-release
84+
docker-cmake-debug docker-build-debug docker-test-debug docker-clean-debug docker-install-debug docker-cmake-release docker-build-release docker-test-release docker-clean-release docker-install-release: docker-%:
85+
$(DOCKER_COMPOSE) run --rm vpn_manager-container make $*
86+
87+
# Stop docker container and remove PG data
88+
.PHONY: docker-clean-data
89+
docker-clean-data:
90+
$(DOCKER_COMPOSE) down -v
91+
rm -rf ./.pgdata

README.md

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,36 @@
1-
# Description
2-
VPN Manager HTTP API written in C++
1+
# VPN Manager API CPP
2+
3+
Stack: c++20, userver, postgres
4+
5+
# How to dev
6+
7+
## How to run in VS Code
8+
9+
- Install extensions:
10+
- clangd
11+
- DevContainers
12+
- RemoteSSH
13+
14+
- F1 -> Dev Containers: Open Folder in Container...
15+
- Choose docker-compose
16+
- When opened in dev container, delete all build* folders
17+
18+
In terminal:
19+
- `apt-get install clangd && apt update -y && apt upgrade -y`
20+
21+
Set password for root:
22+
- `passwd root`, `1234`
23+
24+
Then set password for user:
25+
- `passwd user`, `1234`
26+
- `sudo usermod -aG sudo user` - make user a sudoer
27+
- `su -s /bin/bash user`
28+
29+
Specify the clangd path to the compile_commands.json file. To do this, add the following to the .vscode/settings.json config:
30+
"clangd.arguments": [ "--compile-commands-dir=${workspaceFolder}/build_debug" ],
31+
The compile_commands.json file is a service file that CMake creates during project configuration. The directory can be useful if you are, for example, building a release.
32+
33+
Restart VSCode and open the project directory again via devcontainers. Don't forget to switch to the user again using the method described above. Now you can build the project and run it from the vscode terminal:
34+
make build-debug / make service-start-debug. Autocompletion and syntax highlighting should also work.
35+
36+
**To run:** make build-debug

0 commit comments

Comments
 (0)