Skip to content

Commit a727faa

Browse files
committed
Import module to github
1 parent a0fe05c commit a727faa

Some content is hidden

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

44 files changed

+2310
-1
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/.idea/
2+
/vendor/
3+
composer.lock
4+
_build

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# user
2-
Api base authentication and user managment via laminas and pi
2+
Api base authentication and user management via laminas and pi engine

composer.json

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
{
2+
"name": "pi/user",
3+
"description": "Api base authentication and user management via laminas and pi engine",
4+
"license": "BSD-3-Clause",
5+
"keywords": [
6+
"Pi",
7+
"Pi Engine",
8+
"Laminas",
9+
"Laminas MVC",
10+
"User management",
11+
"User management",
12+
"Psr",
13+
"MultiTenant",
14+
"SaaS"
15+
],
16+
"homepage": "https://piengine.org",
17+
"authors": [
18+
{
19+
"name": "Hossein Azizabadi Farahani",
20+
"email": "[email protected]"
21+
}
22+
],
23+
"require": {
24+
"php": "^7.4 || ~8.0.0",
25+
"ext-ctype": "*",
26+
"ext-fileinfo": "*",
27+
"ext-gd": "*",
28+
"ext-json": "*",
29+
"ext-mbstring": "*",
30+
"ext-pdo": "*",
31+
"ext-spl": "*",
32+
"lib-curl": "*",
33+
34+
"laminas/laminas-mvc": "^3.1.1",
35+
"laminas/laminas-mvc-i18n": "^1.2.0",
36+
"laminas/laminas-mvc-plugins": "^1.1.0",
37+
"laminas/laminas-mvc-middleware": "^2.2",
38+
"laminas/laminas-db": "^2.12.0",
39+
"laminas/laminas-json": "^3.2",
40+
"laminas/laminas-log": "^2.13.1",
41+
"laminas/laminas-authentication": "^2.9",
42+
"laminas/laminas-crypt": "^3.6",
43+
"laminas/laminas-http": "^2.15",
44+
"laminas/laminas-eventmanager": "^3.4",
45+
"laminas/laminas-cache": "^3.1",
46+
"laminas/laminas-cache-storage-adapter-redis": "^2.1",
47+
"laminas/laminas-serializer": "^2.12",
48+
"laminas/laminas-inputfilter": "^2.13",
49+
"firebase/php-jwt": "^5.5"
50+
},
51+
52+
"autoload": {
53+
"psr-4": {
54+
"Pi\\User\\": "src/"
55+
}
56+
},
57+
58+
"suggest": {
59+
"ext-apc": "for opcode cache and system persistent data",
60+
"ext-discount": "for Markdown text parsing",
61+
"ext-intl": "for i18n features"
62+
}
63+
}

config/custom.config.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
return [
4+
'jwt' => [
5+
'secret' => 'xt2468xc9mh5hvnal80rng36bbk16co4',
6+
'exp_access' => 900, // 15 min
7+
'exp_refresh' => 7776000, // 90 days
8+
],
9+
];

config/module.config.php

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<?php
2+
3+
namespace User;
4+
5+
use Laminas\Mvc\Middleware\PipeSpec;
6+
use Laminas\Router\Http\Literal;
7+
8+
return [
9+
'service_manager' => [
10+
'aliases' => [
11+
Repository\AccountRepositoryInterface::class => Repository\AccountRepository::class,
12+
Service\ServiceInterface::class => Service\AccountService::class,
13+
],
14+
'factories' => [
15+
Repository\AccountRepository::class => Factory\Repository\AccountRepositoryFactory::class,
16+
Service\AccountService::class => Factory\Service\AccountServiceFactory::class,
17+
Service\TokenService::class => Factory\Service\TokenServiceFactory::class,
18+
Service\CacheService::class => Factory\Service\CacheServiceFactory::class,
19+
Middleware\AuthenticationMiddleware::class => Factory\Middleware\AuthenticationMiddlewareFactory::class,
20+
Middleware\SecurityMiddleware::class => Factory\Middleware\SecurityMiddlewareFactory::class,
21+
Middleware\ValidationMiddleware::class => Factory\Middleware\ValidationMiddlewareFactory::class,
22+
Validator\EmailValidator::class => Factory\Validator\EmailValidatorFactory::class,
23+
Validator\IdentityValidator::class => Factory\Validator\IdentityValidatorFactory::class,
24+
Validator\NameValidator::class => Factory\Validator\NameValidatorFactory::class,
25+
Handler\Api\ProfileHandler::class => Factory\Handler\Api\ProfileHandlerFactory::class,
26+
Handler\Api\LoginHandler::class => Factory\Handler\Api\LoginHandlerFactory::class,
27+
Handler\Api\LogoutHandler::class => Factory\Handler\Api\LogoutHandlerFactory::class,
28+
Handler\Api\RegisterHandler::class => Factory\Handler\Api\RegisterHandlerFactory::class,
29+
Handler\Api\RefreshHandler::class => Factory\Handler\Api\RefreshHandlerFactory::class,
30+
Handler\ErrorHandler::class => Factory\Handler\ErrorHandlerFactory::class,
31+
],
32+
],
33+
34+
'router' => [
35+
'routes' => [
36+
'user' => [
37+
'type' => Literal::class,
38+
'options' => [
39+
'route' => '/user',
40+
'defaults' => [],
41+
],
42+
'child_routes' => [
43+
'login' => [
44+
'type' => Literal::class,
45+
'options' => [
46+
'route' => '/login',
47+
'defaults' => [
48+
'controller' => PipeSpec::class,
49+
'middleware' => new PipeSpec(
50+
Middleware\ValidationMiddleware::class,
51+
Middleware\SecurityMiddleware::class,
52+
Handler\Api\LoginHandler::class
53+
),
54+
],
55+
],
56+
],
57+
'logout' => [
58+
'type' => Literal::class,
59+
'options' => [
60+
'route' => '/logout',
61+
'defaults' => [
62+
'controller' => PipeSpec::class,
63+
'middleware' => new PipeSpec(
64+
Middleware\AuthenticationMiddleware::class,
65+
Middleware\SecurityMiddleware::class,
66+
Handler\Api\LogoutHandler::class
67+
),
68+
],
69+
],
70+
],
71+
'register' => [
72+
'type' => Literal::class,
73+
'options' => [
74+
'route' => '/register',
75+
'defaults' => [
76+
'controller' => PipeSpec::class,
77+
'middleware' => new PipeSpec(
78+
Middleware\ValidationMiddleware::class,
79+
Middleware\SecurityMiddleware::class,
80+
Handler\Api\RegisterHandler::class
81+
),
82+
],
83+
],
84+
],
85+
'profile' => [
86+
'type' => Literal::class,
87+
'options' => [
88+
'route' => '/profile',
89+
'defaults' => [
90+
'controller' => PipeSpec::class,
91+
'middleware' => new PipeSpec(
92+
Middleware\AuthenticationMiddleware::class,
93+
Middleware\SecurityMiddleware::class,
94+
Handler\Api\ProfileHandler::class
95+
),
96+
],
97+
],
98+
],
99+
'refresh' => [
100+
'type' => Literal::class,
101+
'options' => [
102+
'route' => '/refresh',
103+
'defaults' => [
104+
'controller' => PipeSpec::class,
105+
'middleware' => new PipeSpec(
106+
Middleware\AuthenticationMiddleware::class,
107+
Middleware\SecurityMiddleware::class,
108+
Handler\Api\RefreshHandler::class
109+
),
110+
],
111+
],
112+
],
113+
],
114+
],
115+
],
116+
],
117+
118+
'view_manager' => [
119+
'strategies' => [
120+
'ViewJsonStrategy',
121+
],
122+
],
123+
];

data/schema.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
CREATE TABLE `account`
2+
(
3+
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
4+
`name` VARCHAR(255) DEFAULT NULL,
5+
`identity` VARCHAR(128) DEFAULT NULL,
6+
`email` VARCHAR(128) DEFAULT NULL,
7+
`credential` VARCHAR(255) NOT NULL DEFAULT '',
8+
`status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
9+
`time_created` INT(10) UNSIGNED NOT NULL DEFAULT '0',
10+
`time_activated` INT(10) UNSIGNED NOT NULL DEFAULT '0',
11+
`time_disabled` INT(10) UNSIGNED NOT NULL DEFAULT '0',
12+
`time_deleted` INT(10) UNSIGNED NOT NULL DEFAULT '0',
13+
PRIMARY KEY (`id`),
14+
UNIQUE KEY `identity` (`identity`),
15+
UNIQUE KEY `email` (`email`),
16+
KEY `name` (`name`),
17+
KEY `status` (`status`)
18+
);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace User\Factory\Handler\Api;
4+
5+
use Interop\Container\ContainerInterface;
6+
use Laminas\ServiceManager\Factory\FactoryInterface;
7+
use Psr\Container\ContainerExceptionInterface;
8+
use Psr\Container\NotFoundExceptionInterface;
9+
use Psr\Http\Message\ResponseFactoryInterface;
10+
use Psr\Http\Message\StreamFactoryInterface;
11+
use User\Handler\Api\LoginHandler;
12+
use User\Service\AccountService;
13+
use User\Service\TokenService;
14+
15+
class LoginHandlerFactory implements FactoryInterface
16+
{
17+
/**
18+
* @param ContainerInterface $container
19+
* @param string $requestedName
20+
* @param null|array $options
21+
* @return LoginHandler
22+
* @throws ContainerExceptionInterface
23+
* @throws NotFoundExceptionInterface
24+
*/
25+
public function __invoke(ContainerInterface $container, $requestedName, array $options = null): LoginHandler
26+
{
27+
return new LoginHandler(
28+
$container->get(ResponseFactoryInterface::class),
29+
$container->get(StreamFactoryInterface::class),
30+
$container->get(AccountService::class),
31+
$container->get(TokenService::class)
32+
);
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace User\Factory\Handler\Api;
4+
5+
use Interop\Container\ContainerInterface;
6+
use Laminas\ServiceManager\Factory\FactoryInterface;
7+
use Psr\Container\ContainerExceptionInterface;
8+
use Psr\Container\NotFoundExceptionInterface;
9+
use Psr\Http\Message\ResponseFactoryInterface;
10+
use Psr\Http\Message\StreamFactoryInterface;
11+
use User\Handler\Api\LogoutHandler;
12+
use User\Service\AccountService;
13+
use User\Service\TokenService;
14+
15+
class LogoutHandlerFactory implements FactoryInterface
16+
{
17+
/**
18+
* @param ContainerInterface $container
19+
* @param string $requestedName
20+
* @param null|array $options
21+
* @return LogoutHandler
22+
* @throws ContainerExceptionInterface
23+
* @throws NotFoundExceptionInterface
24+
*/
25+
public function __invoke(ContainerInterface $container, $requestedName, array $options = null): LogoutHandler
26+
{
27+
return new LogoutHandler(
28+
$container->get(ResponseFactoryInterface::class),
29+
$container->get(StreamFactoryInterface::class),
30+
$container->get(AccountService::class),
31+
$container->get(TokenService::class)
32+
);
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace User\Factory\Handler\Api;
4+
5+
use Interop\Container\ContainerInterface;
6+
use Laminas\ServiceManager\Factory\FactoryInterface;
7+
use Psr\Container\ContainerExceptionInterface;
8+
use Psr\Container\NotFoundExceptionInterface;
9+
use Psr\Http\Message\ResponseFactoryInterface;
10+
use Psr\Http\Message\StreamFactoryInterface;
11+
use User\Handler\Api\ProfileHandler;
12+
use User\Service\AccountService;
13+
use User\Service\TokenService;
14+
15+
class ProfileHandlerFactory implements FactoryInterface
16+
{
17+
/**
18+
* @param ContainerInterface $container
19+
* @param string $requestedName
20+
* @param null|array $options
21+
* @return ProfileHandler
22+
* @throws ContainerExceptionInterface
23+
* @throws NotFoundExceptionInterface
24+
*/
25+
public function __invoke(ContainerInterface $container, $requestedName, array $options = null): ProfileHandler
26+
{
27+
return new ProfileHandler(
28+
$container->get(ResponseFactoryInterface::class),
29+
$container->get(StreamFactoryInterface::class),
30+
$container->get(AccountService::class),
31+
$container->get(TokenService::class)
32+
);
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace User\Factory\Handler\Api;
4+
5+
use Interop\Container\ContainerInterface;
6+
use Laminas\ServiceManager\Factory\FactoryInterface;
7+
use Psr\Container\ContainerExceptionInterface;
8+
use Psr\Container\NotFoundExceptionInterface;
9+
use Psr\Http\Message\ResponseFactoryInterface;
10+
use Psr\Http\Message\StreamFactoryInterface;
11+
use User\Handler\Api\RefreshHandler;
12+
use User\Service\AccountService;
13+
use User\Service\TokenService;
14+
15+
class RefreshHandlerFactory implements FactoryInterface
16+
{
17+
/**
18+
* @param ContainerInterface $container
19+
* @param string $requestedName
20+
* @param null|array $options
21+
* @return RefreshHandler
22+
* @throws ContainerExceptionInterface
23+
* @throws NotFoundExceptionInterface
24+
*/
25+
public function __invoke(ContainerInterface $container, $requestedName, array $options = null): RefreshHandler
26+
{
27+
return new RefreshHandler(
28+
$container->get(ResponseFactoryInterface::class),
29+
$container->get(StreamFactoryInterface::class),
30+
$container->get(AccountService::class),
31+
$container->get(TokenService::class)
32+
);
33+
}
34+
}

0 commit comments

Comments
 (0)