diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cd8eb86 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +; This file is for unifying the coding style for different editors and IDEs. +; More information at http://editorconfig.org + +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..32a7b57 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/build +/dist +/vendor +/node_modules +package-lock.json +composer.phar +composer.lock +phpunit.xml +.phpunit.result.cache +yarn.lock \ No newline at end of file diff --git a/.scrutinizer.yml b/.scrutinizer.yml new file mode 100644 index 0000000..df16b68 --- /dev/null +++ b/.scrutinizer.yml @@ -0,0 +1,19 @@ +filter: + excluded_paths: [tests/*] + +checks: + php: + remove_extra_empty_lines: true + remove_php_closing_tag: true + remove_trailing_whitespace: true + fix_use_statements: + remove_unused: true + preserve_multiple: false + preserve_blanklines: true + order_alphabetically: true + fix_php_opening_tag: true + fix_linefeed: true + fix_line_ending: true + fix_identation_4spaces: true + fix_doc_comments: true + diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 0000000..0285f17 --- /dev/null +++ b/.styleci.yml @@ -0,0 +1 @@ +preset: laravel diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b95d9ac --- /dev/null +++ b/.travis.yml @@ -0,0 +1,21 @@ +language: php + +php: + - 7.0 + - 7.1 + - 7.2 + +env: + matrix: + - COMPOSER_FLAGS="--prefer-lowest" + - COMPOSER_FLAGS="" + +before_script: + - travis_retry composer self-update + - travis_retry composer update ${COMPOSER_FLAGS} --no-interaction --prefer-source + +script: + - phpunit --coverage-text --coverage-clover=coverage.clover + +after_script: + - php vendor/bin/ocular code-coverage:upload --format=php-clover coverage.clover diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..65e7be5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +All notable changes to `nova-backup-tool` will be documented in this file + +## 1.0.0 - 2018-XX-XX + +- initial release diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4da74e3 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,55 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +Please read and understand the contribution guide before creating an issue or pull request. + +## Etiquette + +This project is open source, and as such, the maintainers give their free time to build and maintain the source code +held within. They make the code freely available in the hope that it will be of use to other developers. It would be +extremely unfair for them to suffer abuse or anger for their hard work. + +Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the +world that developers are civilized and selfless people. + +It's the duty of the maintainer to ensure that all submissions to the project are of sufficient +quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. + +## Viability + +When requesting or submitting new features, first consider whether it might be useful to others. Open +source projects are used by many developers, who may have entirely different needs to your own. Think about +whether or not your feature is likely to be used by other users of the project. + +## Procedure + +Before filing an issue: + +- Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. +- Check to make sure your feature suggestion isn't already present within the project. +- Check the pull requests tab to ensure that the bug doesn't have a fix in progress. +- Check the pull requests tab to ensure that the feature isn't already in progress. + +Before submitting a pull request: + +- Check the codebase to ensure that your feature doesn't already exist. +- Check the pull requests to ensure that another person hasn't already submitted the feature or fix. + +## Requirements + +If the project maintainer has any additional requirements, you will find them listed here. + +- **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer). + +- **Add tests!** - Your patch won't be accepted if it doesn't have tests. + +- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. + +- **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. + +**Happy coding**! diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..59e5ec5 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Spatie bvba + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e471f0 --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +# :package_description + +[![Latest Version on Packagist](https://img.shields.io/packagist/v/spatie/nova-backup-tool.svg?style=flat-square)](https://packagist.org/packages/spatie/nova-backup-tool) +[![Build Status](https://img.shields.io/travis/spatie/nova-backup-tool/master.svg?style=flat-square)](https://travis-ci.org/spatie/nova-backup-tool) +[![Quality Score](https://img.shields.io/scrutinizer/g/spatie/nova-backup-tool.svg?style=flat-square)](https://scrutinizer-ci.com/g/spatie/nova-backup-tool) +[![Total Downloads](https://img.shields.io/packagist/dt/spatie/nova-backup-tool.svg?style=flat-square)](https://packagist.org/packages/spatie/nova-backup-tool) + +**Note:** Replace ```:author_name``` ```:author_username``` ```:author_email``` ```:package_name``` ```:tool_name``` ```:package_description``` with their correct values in [README.md](README.md), [CHANGELOG.md](CHANGELOG.md), [CONTRIBUTING.md](CONTRIBUTING.md), [LICENSE.md](LICENSE.md) and [composer.json](composer.json) files, then delete this line. + +This is where your description should go. Try and limit it to a paragraph or two and add a screenshot. + +## Requirements + +The requirements for installing this tool. + +## Installation + +You can install the package via composer: + +```bash +composer require spatie/:package_name + +Next up, you must register the tool with Nova. This is typically done in the `register` method of the `NovaServiceProvider`. + +```php +// in app/Providers/NovaServiceProvder.php + +// ... + +public function register() +{ + Nova::tools([ + // ... + new \Spatie\:tool_name\:tool_name(), + ]); +} +``` + +## Usage + +Click on the "Backups" menu item in your Nova app to see the log. + +### Authentication + +By default the tool can only be seen and used in the local environment. To define a more specific access policy for the tool, you should use the `:tool_name::auth` method. The `auth` method accepts a callback which should return true or false, indicating whether the user should have access to the tool. Typically, you should call `NovaTool::auth` in the boot method a service provider: + +```php +// in a service provider + +use Spatie\:tool_name\:tool_name; + +// ... + +:tool_name::auth(function ($request) { + // return true / false; +}); +``` + +### Testing + +``` bash +composer test +``` + +### Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +### Security + +If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker. + +## Postcardware + +You're free to use this package, but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. + +Our address is: Spatie, Samberstraat 69D, 2060 Antwerp, Belgium. + +We publish all received postcards [on our company website](https://spatie.be/en/opensource/postcards). + +## Credits + +- [:author_name](https://github.com/:author_username) +- [All Contributors](../../contributors) + +## Support us + +Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects [on our website](https://spatie.be/opensource). + +Does your business depend on our contributions? Reach out and support us on [Patreon](https://www.patreon.com/spatie). +All pledges will be dedicated to allocating workforce on maintenance and new awesome stuff. + +## License + +The MIT License (MIT). Please see [License File](LICENSE.md) for more information. diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..f17689e --- /dev/null +++ b/composer.json @@ -0,0 +1,54 @@ +{ + "name": "spatie/:package_name", + "description": ":package_description", + "keywords": [ + "laravel", + "nova" + ], + "homepage": "https://github.com/spatie/:package_name", + "license": "MIT", + "authors": [ + { + "name": ":author_name", + "email": ":author_email", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "repositories": [ + { + "type": "path", + "url": "../nova" + } + ], + "require": { + "php": ">=7.1.0", + "laravel/nova": "*" + }, + "require-dev": { + "orchestra/testbench": "^3.6", + "phpunit/phpunit": "7.1" + }, + "autoload": { + "psr-4": { + "Spatie\\:tool_name\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Spatie\\:tool_name\\Tests\\": "tests" + } + }, + "extra": { + "laravel": { + "providers": [ + "Spatie\\:tool_name\\:tool_nameServiceProvider" + ] + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/mix-manifest.json b/mix-manifest.json new file mode 100644 index 0000000..8feb52b --- /dev/null +++ b/mix-manifest.json @@ -0,0 +1,4 @@ +{ + "/dist/js/tool.js": "/dist/js/tool.js", + "/dist/css/tool.css": "/dist/css/tool.css" +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..fb91be3 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "private": true, + "scripts": { + "dev": "npm run development", + "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch-poll": "npm run watch -- --watch-poll", + "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", + "prod": "npm run production", + "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + }, + "devDependencies": { + "cross-env": "^5.0.0", + "laravel-mix": "^1.0" + }, + "dependencies": { + "vue": "^2.5.0" + } +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..7a65b9f --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,22 @@ + + + + + tests + + + + + src/ + + + diff --git a/resources/js/api.js b/resources/js/api.js new file mode 100644 index 0000000..5c933b1 --- /dev/null +++ b/resources/js/api.js @@ -0,0 +1,3 @@ +export default { + +} \ No newline at end of file diff --git a/resources/js/components/BackupStatusses.vue b/resources/js/components/BackupStatusses.vue new file mode 100644 index 0000000..b9dbe5e --- /dev/null +++ b/resources/js/components/BackupStatusses.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/resources/js/components/Backups.vue b/resources/js/components/Backups.vue new file mode 100644 index 0000000..38cd1c9 --- /dev/null +++ b/resources/js/components/Backups.vue @@ -0,0 +1,162 @@ + + + \ No newline at end of file diff --git a/resources/js/components/Tool.vue b/resources/js/components/Tool.vue new file mode 100644 index 0000000..9b1cb8d --- /dev/null +++ b/resources/js/components/Tool.vue @@ -0,0 +1,86 @@ + + + \ No newline at end of file diff --git a/resources/js/tool.js b/resources/js/tool.js new file mode 100644 index 0000000..298acf6 --- /dev/null +++ b/resources/js/tool.js @@ -0,0 +1,9 @@ +Nova.booting((Vue, router) => { + router.addRoutes([ + { + name: 'NovaTool', + path: '/NovaTool', + component: require('./components/Tool'), + }, + ]) +}) diff --git a/resources/sass/tool.scss b/resources/sass/tool.scss new file mode 100644 index 0000000..f85ad40 --- /dev/null +++ b/resources/sass/tool.scss @@ -0,0 +1 @@ +// Nova Tool CSS diff --git a/resources/views/navigation.blade.php b/resources/views/navigation.blade.php new file mode 100644 index 0000000..5156713 --- /dev/null +++ b/resources/views/navigation.blade.php @@ -0,0 +1,6 @@ + + + + Backups + + diff --git a/routes/api.php b/routes/api.php new file mode 100644 index 0000000..d235a9a --- /dev/null +++ b/routes/api.php @@ -0,0 +1,5 @@ +respondSuccess(); + } +} \ No newline at end of file diff --git a/src/Middleware/Authenticate.php b/src/Middleware/Authenticate.php new file mode 100644 index 0000000..0858b70 --- /dev/null +++ b/src/Middleware/Authenticate.php @@ -0,0 +1,19 @@ +canSee(function () { + return static::check(request()); + }); + } + + public function renderNavigation() + { + return view('NovaTool::navigation'); + } + + public static function auth(Closure $callback): NovaTool + { + static::$authUsing = $callback; + + return new static; + } + + public static function check(Request $request): bool + { + return (static::$authUsing ?? function () { + return app()->environment('local'); + })($request); + } +} diff --git a/src/NovaToolServiceProvider.php b/src/NovaToolServiceProvider.php new file mode 100644 index 0000000..a06dde2 --- /dev/null +++ b/src/NovaToolServiceProvider.php @@ -0,0 +1,32 @@ +loadViewsFrom(__DIR__ . '/../resources/views', 'NovaTool'); + } + + public function register() + { + Route::prefix($this->getNovaUrl('backup-tool'))->middleware(Authenticate::class)->group(function () { + $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); + }); + } + + public function getNovaUrl(string $url = '/'): string + { + if (!class_exists(Nova::class)) { + return "/nova/{$url}"; + } + + return Nova::path() . "/{$url}"; + } +} diff --git a/tests/Controllers/NovaToolControllerTest.php b/tests/Controllers/NovaToolControllerTest.php new file mode 100644 index 0000000..74a411d --- /dev/null +++ b/tests/Controllers/NovaToolControllerTest.php @@ -0,0 +1,17 @@ +getJson('/nova/nova-tool')->assertSuccessful(); + + } +} \ No newline at end of file diff --git a/tests/Middleware/AuthenticateTest.php b/tests/Middleware/AuthenticateTest.php new file mode 100644 index 0000000..964735f --- /dev/null +++ b/tests/Middleware/AuthenticateTest.php @@ -0,0 +1,22 @@ +get('/nova/nova-tool')->assertSuccessful(); + + NovaTool::auth(function() { + return false; + }); + + $this->get('/nova/nova-tool')->assertStatus(Response::HTTP_FORBIDDEN); + } +} diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..819a6be --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,31 @@ +