Compare commits

...

2 Commits

  1. 5
      app/Http/Controllers/DonationController.php
  2. 3
      composer.json
  3. 161
      composer.lock
  4. 2
      config/app.php
  5. 2
      public/js/app.js
  6. 2
      public/mix-manifest.json
  7. 197
      resources/js/components/DonationCard.vue

@ -20,8 +20,8 @@ class DonationController extends Controller
public function donate(Request $request) public function donate(Request $request)
{ {
// dd($request);
$request->validate([ $request->validate([
'captcha' => 'required|captcha_api:' . request('captcha_key') . ',math',
"amount" => 'required|numeric', "amount" => 'required|numeric',
"currency" => 'required|in:USD,EUR,TL', "currency" => 'required|in:USD,EUR,TL',
"frequency" => 'required|in:once,monthly,annually', "frequency" => 'required|in:once,monthly,annually',
@ -39,6 +39,8 @@ class DonationController extends Controller
"billing_city" => 'required|string', "billing_city" => 'required|string',
"billing_country" => 'required|string', "billing_country" => 'required|string',
"billing_zipcode" => 'nullable|string', "billing_zipcode" => 'nullable|string',
], [
"captcha.captcha_api" => "Wrong captcha answer."
]); ]);
$iyzipayCurrencies = [ $iyzipayCurrencies = [
@ -170,7 +172,6 @@ class DonationController extends Controller
$donation->save(); $donation->save();
Mail::to($donation)->send(new SuccessfulPayment($donation)); Mail::to($donation)->send(new SuccessfulPayment($donation));
return redirect()->route('donation.success', $donation->conversation_id); return redirect()->route('donation.success', $donation->conversation_id);
} }
public function success($conversation_id, Request $request) public function success($conversation_id, Request $request)

@ -15,7 +15,8 @@
"iyzico/iyzipay-php": "^2.0", "iyzico/iyzipay-php": "^2.0",
"laravel/framework": "^7.0", "laravel/framework": "^7.0",
"laravel/tinker": "^2.0", "laravel/tinker": "^2.0",
"laravel/ui": "^2.0" "laravel/ui": "^2.0",
"mews/captcha": "^3.2"
}, },
"require-dev": { "require-dev": {
"facade/ignition": "^2.0", "facade/ignition": "^2.0",

161
composer.lock generated

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "3c8c87be7e4bc22d08441bd151d1521b", "content-hash": "758f6c8d5f7d18f90310d3fcbfda6541",
"packages": [ "packages": [
{ {
"name": "asm89/stack-cors", "name": "asm89/stack-cors",
@ -725,6 +725,90 @@
], ],
"time": "2019-07-01T23:21:34+00:00" "time": "2019-07-01T23:21:34+00:00"
}, },
{
"name": "intervention/image",
"version": "2.7.2",
"source": {
"type": "git",
"url": "https://github.com/Intervention/image.git",
"reference": "04be355f8d6734c826045d02a1079ad658322dad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Intervention/image/zipball/04be355f8d6734c826045d02a1079ad658322dad",
"reference": "04be355f8d6734c826045d02a1079ad658322dad",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"guzzlehttp/psr7": "~1.1 || ^2.0",
"php": ">=5.4.0"
},
"require-dev": {
"mockery/mockery": "~0.9.2",
"phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15"
},
"suggest": {
"ext-gd": "to use GD library based image processing.",
"ext-imagick": "to use Imagick based image processing.",
"intervention/imagecache": "Caching extension for the Intervention Image library"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.4-dev"
},
"laravel": {
"providers": [
"Intervention\\Image\\ImageServiceProvider"
],
"aliases": {
"Image": "Intervention\\Image\\Facades\\Image"
}
}
},
"autoload": {
"psr-4": {
"Intervention\\Image\\": "src/Intervention/Image"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Oliver Vogel",
"email": "oliver@intervention.io",
"homepage": "https://intervention.io/"
}
],
"description": "Image handling and manipulation library with support for Laravel integration",
"homepage": "http://image.intervention.io/",
"keywords": [
"gd",
"image",
"imagick",
"laravel",
"thumbnail",
"watermark"
],
"support": {
"issues": "https://github.com/Intervention/image/issues",
"source": "https://github.com/Intervention/image/tree/2.7.2"
},
"funding": [
{
"url": "https://paypal.me/interventionio",
"type": "custom"
},
{
"url": "https://github.com/Intervention",
"type": "github"
}
],
"time": "2022-05-21T17:30:32+00:00"
},
{ {
"name": "iyzico/iyzipay-php", "name": "iyzico/iyzipay-php",
"version": "v2.0.48", "version": "v2.0.48",
@ -1238,6 +1322,79 @@
], ],
"time": "2020-05-12T20:33:44+00:00" "time": "2020-05-12T20:33:44+00:00"
}, },
{
"name": "mews/captcha",
"version": "3.2.8",
"source": {
"type": "git",
"url": "https://github.com/mewebstudio/captcha.git",
"reference": "29444eb2699ab32a4b065422375a85b75c0ac51f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/mewebstudio/captcha/zipball/29444eb2699ab32a4b065422375a85b75c0ac51f",
"reference": "29444eb2699ab32a4b065422375a85b75c0ac51f",
"shasum": ""
},
"require": {
"ext-gd": "*",
"illuminate/config": "~5|^6|^7|^8|^9",
"illuminate/filesystem": "~5|^6|^7|^8|^9",
"illuminate/hashing": "~5|^6|^7|^8|^9",
"illuminate/session": "~5|^6|^7|^8|^9",
"illuminate/support": "~5|^6|^7|^8|^9",
"intervention/image": "~2.5",
"php": "^7.2|^8.0"
},
"require-dev": {
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^8.5|^9.0"
},
"type": "package",
"extra": {
"laravel": {
"providers": [
"Mews\\Captcha\\CaptchaServiceProvider"
],
"aliases": {
"Captcha": "Mews\\Captcha\\Facades\\Captcha"
}
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Mews\\Captcha\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Muharrem ERİN",
"email": "me@mewebstudio.com",
"homepage": "https://github.com/mewebstudio",
"role": "Developer"
}
],
"description": "Laravel 5 & 6 Captcha Package",
"homepage": "https://github.com/mewebstudio/captcha",
"keywords": [
"captcha",
"laravel5 Security",
"laravel6 Captcha",
"laravel6 Security"
],
"support": {
"issues": "https://github.com/mewebstudio/captcha/issues",
"source": "https://github.com/mewebstudio/captcha/tree/3.2.8"
},
"time": "2022-07-20T12:11:44+00:00"
},
{ {
"name": "monolog/monolog", "name": "monolog/monolog",
"version": "2.0.2", "version": "2.0.2",
@ -5927,5 +6084,5 @@
"php": "^7.2.5" "php": "^7.2.5"
}, },
"platform-dev": [], "platform-dev": [],
"plugin-api-version": "1.1.0" "plugin-api-version": "2.3.0"
} }

@ -161,6 +161,7 @@ return [
Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class, Illuminate\View\ViewServiceProvider::class,
Mews\Captcha\CaptchaServiceProvider::class,
/* /*
* Package Service Providers... * Package Service Providers...
@ -226,6 +227,7 @@ return [
'URL' => Illuminate\Support\Facades\URL::class, 'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class, 'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class, 'View' => Illuminate\Support\Facades\View::class,
'Captcha' => Mews\Captcha\Facades\Captcha::class,
], ],

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long

@ -1,4 +1,4 @@
{ {
"/js/app.js": "/js/app.js?id=7ae1ff303438afdbd8bb", "/js/app.js": "/js/app.js?id=750208dadef409a48074",
"/css/app.css": "/css/app.css?id=36412c9f34a08f26af3c" "/css/app.css": "/css/app.css?id=36412c9f34a08f26af3c"
} }

@ -4,12 +4,17 @@
<div class="form-group row mb-0"> <div class="form-group row mb-0">
<div class="col-12"> <div class="col-12">
<h1>Donate</h1> <h1>Donate</h1>
<p>Özgür Yazılım Derneği is a registered association in İstanbul, Turkey with the number 34-242-113</p> <p>
Özgür Yazılım Derneği is a registered association in İstanbul,
Turkey with the number 34-242-113
</p>
</div> </div>
</div> </div>
<form method="POST" action="/make-donation"> <form method="POST" action="/make-donation">
<div class="form-group row"> <div class="form-group row">
<label for="currency" class="col-md-4 col-form-label text-md-right">Donation currency</label> <label for="currency" class="col-md-4 col-form-label text-md-right"
>Donation currency</label
>
<div class="col-md-8"> <div class="col-md-8">
<div class="row"> <div class="row">
@ -21,15 +26,22 @@
<button <button
type="button" type="button"
class="btn btn-block mb-2" class="btn btn-block mb-2"
:class="{'btn-primary':currency==currencyItem.code, 'btn-outline-primary':currency!=currencyItem.code}" :class="{
'btn-primary': currency == currencyItem.code,
'btn-outline-primary': currency != currencyItem.code,
}"
@click="currency = currencyItem.code" @click="currency = currencyItem.code"
>{{currencyItem.symbol}} | {{currencyItem.name}}</button> >
{{ currencyItem.symbol }} | {{ currencyItem.name }}
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="frequency" class="col-md-4 col-form-label text-md-right">Donation frequency</label> <label for="frequency" class="col-md-4 col-form-label text-md-right"
>Donation frequency</label
>
<div class="col-md-8"> <div class="col-md-8">
<div class="row"> <div class="row">
@ -41,15 +53,24 @@
<button <button
type="button" type="button"
class="btn btn-block mb-2" class="btn btn-block mb-2"
:class="{'btn-primary':frequency==frequencyItem.code, 'btn-outline-primary':frequency!=frequencyItem.code}" :class="{
'btn-primary': frequency == frequencyItem.code,
'btn-outline-primary': frequency != frequencyItem.code,
}"
@click="setFrequency(frequencyItem.code)" @click="setFrequency(frequencyItem.code)"
>{{frequencyItem.name}}</button> >
{{ frequencyItem.name }}
</button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="donationPackage" class="col-md-4 col-form-label text-md-right">Donation amount</label> <label
for="donationPackage"
class="col-md-4 col-form-label text-md-right"
>Donation amount</label
>
<div class="col-md-8"> <div class="col-md-8">
<div class="row"> <div class="row">
@ -61,15 +82,23 @@
<button <button
type="button" type="button"
class="btn btn-block mb-2" class="btn btn-block mb-2"
:class="{'btn-primary':donationPackage==donationPackageItem.id, 'btn-outline-primary':donationPackage!=donationPackageItem.id}" :class="{
'btn-primary': donationPackage == donationPackageItem.id,
'btn-outline-primary':
donationPackage != donationPackageItem.id,
}"
@click="setDonationPackage(donationPackageItem.id)" @click="setDonationPackage(donationPackageItem.id)"
> >
<span>{{ activeCurrency.symbol }}</span> <span>{{ activeCurrency.symbol }}</span>
<span v-if="frequency=='once'">{{donationPackageItem.once_amount}}</span> <span v-if="frequency == 'once'">{{
<span v-else-if="frequency=='monthly'">{{donationPackageItem.monthly_amount}} /mo</span> donationPackageItem.once_amount
<span }}</span>
v-else-if="frequency=='annually'" <span v-else-if="frequency == 'monthly'"
>{{donationPackageItem.annually_amount}} /yr</span> >{{ donationPackageItem.monthly_amount }} /mo</span
>
<span v-else-if="frequency == 'annually'"
>{{ donationPackageItem.annually_amount }} /yr</span
>
<br /> <br />
<small>{{ donationPackageItem.name }}</small> <small>{{ donationPackageItem.name }}</small>
@ -79,7 +108,10 @@
<button <button
type="button" type="button"
class="btn btn-block mb-2" class="btn btn-block mb-2"
:class="{'btn-primary':donationPackage==null, 'btn-outline-primary':donationPackage!=null}" :class="{
'btn-primary': donationPackage == null,
'btn-outline-primary': donationPackage != null,
}"
@click="setDonationPackage(null)" @click="setDonationPackage(null)"
> >
<small>other</small> <small>other</small>
@ -87,7 +119,9 @@
<div class="input-group mb-3"> <div class="input-group mb-3">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">{{activeCurrency.symbol}}</span> <span class="input-group-text">{{
activeCurrency.symbol
}}</span>
</div> </div>
<input <input
type="number" type="number"
@ -100,8 +134,16 @@
class="input-group-append" class="input-group-append"
v-if="frequency == 'monthly' || frequency == 'annually'" v-if="frequency == 'monthly' || frequency == 'annually'"
> >
<span v-if="frequency=='monthly'" class="input-group-text">/mo</span> <span
<span v-else-if="frequency=='annually'" class="input-group-text">/yr</span> v-if="frequency == 'monthly'"
class="input-group-text"
>/mo</span
>
<span
v-else-if="frequency == 'annually'"
class="input-group-text"
>/yr</span
>
</div> </div>
</div> </div>
</button> </button>
@ -116,7 +158,9 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="first_name" class="col-md-4 col-form-label text-md-right">First Name</label> <label for="first_name" class="col-md-4 col-form-label text-md-right"
>First Name</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -133,7 +177,9 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="last_name" class="col-md-4 col-form-label text-md-right">Last Name</label> <label for="last_name" class="col-md-4 col-form-label text-md-right"
>Last Name</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -159,12 +205,16 @@
id="show_name" id="show_name"
value="1" value="1"
/> />
<label class="form-check-label" for="show_name">Show my name on donors list</label> <label class="form-check-label" for="show_name"
>Show my name on donors list</label
>
</div> </div>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">E-Mail Address</label> <label for="email" class="col-md-4 col-form-label text-md-right"
>E-Mail Address</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -187,7 +237,8 @@
<label <label
for="card_holder_name" for="card_holder_name"
class="col-md-4 col-form-label text-md-right" class="col-md-4 col-form-label text-md-right"
>Card Holder Name</label> >Card Holder Name</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -204,7 +255,9 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="card_number" class="col-md-4 col-form-label text-md-right">Credit Card Number</label> <label for="card_number" class="col-md-4 col-form-label text-md-right"
>Credit Card Number</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -229,7 +282,8 @@
<label <label
for="card_expire_month" for="card_expire_month"
class="col-md-4 col-form-label text-md-right" class="col-md-4 col-form-label text-md-right"
>Credit Card Expiration</label> >Credit Card Expiration</label
>
<div class="col-3"> <div class="col-3">
<input <input
@ -263,7 +317,9 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="card_cvc" class="col-md-4 col-form-label text-md-right">Credit Card CVC</label> <label for="card_cvc" class="col-md-4 col-form-label text-md-right"
>Credit Card CVC</label
>
<div class="col-3"> <div class="col-3">
<input <input
@ -291,7 +347,8 @@
<label <label
for="billing_contact_name" for="billing_contact_name"
class="col-md-4 col-form-label text-md-right" class="col-md-4 col-form-label text-md-right"
>Contact Name</label> >Contact Name</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -308,7 +365,11 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="billing_address" class="col-md-4 col-form-label text-md-right">Address</label> <label
for="billing_address"
class="col-md-4 col-form-label text-md-right"
>Address</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -325,7 +386,11 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="billing_city" class="col-md-4 col-form-label text-md-right">City</label> <label
for="billing_city"
class="col-md-4 col-form-label text-md-right"
>City</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -342,7 +407,11 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="billing_country" class="col-md-4 col-form-label text-md-right">Country</label> <label
for="billing_country"
class="col-md-4 col-form-label text-md-right"
>Country</label
>
<div class="col-md-6"> <div class="col-md-6">
<input <input
@ -359,7 +428,10 @@
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="billing_zipcode" class="col-md-4 col-form-label text-md-right"> <label
for="billing_zipcode"
class="col-md-4 col-form-label text-md-right"
>
Zip Code Zip Code
<small>optional</small> <small>optional</small>
</label> </label>
@ -377,10 +449,31 @@
</span> </span>
</div> </div>
</div> </div>
<div class="form-group row">
<label for="captcha" class="col-md-4 col-form-label text-md-right">
<img :src="captcha_src" />
</label>
<div class="col-md-3">
<input
id="captcha"
type="text"
placeholder="Captcha"
class="form-control"
:class="{ 'is-invalid': 1 == 0 }"
name="captcha"
/>
<input type="hidden" name="captcha_key" :value="captcha_key" />
<span class="invalid-feedback" role="alert" v-if="1 == 0">
<strong>Sample error</strong>
</span>
</div>
</div>
<div class="form-group row mb-0"> <div class="form-group row mb-0">
<div class="col-md-8 offset-md-4"> <div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary btn-lg">Donate {{amountText}}</button> <button type="submit" class="btn btn-primary btn-lg">
Donate {{ amountText }}
</button>
<!-- <a class="btn btn-link" href="#">Forgot Your Password?</a> --> <!-- <a class="btn btn-link" href="#">Forgot Your Password?</a> -->
</div> </div>
@ -398,6 +491,8 @@
export default { export default {
data() { data() {
return { return {
captcha_src: null,
captcha_key: null,
card_number: null, card_number: null,
card_expire_month: null, card_expire_month: null,
card_expire_year: null, card_expire_year: null,
@ -408,12 +503,12 @@ export default {
currencies: [ currencies: [
{ name: "USD", code: "USD", symbol: "$" }, { name: "USD", code: "USD", symbol: "$" },
{ name: "EUR", code: "EUR", symbol: "€" }, { name: "EUR", code: "EUR", symbol: "€" },
{ name: "TRY", code: "TL", symbol: "₺" } { name: "TRY", code: "TL", symbol: "₺" },
], ],
frequencies: [ frequencies: [
{ name: "once", code: "once" }, { name: "once", code: "once" },
{ name: "monthly", code: "monthly" }, { name: "monthly", code: "monthly" },
{ name: "annually", code: "annually" } { name: "annually", code: "annually" },
], ],
donationPackages: [ donationPackages: [
{ {
@ -421,50 +516,50 @@ export default {
name: "Super Major Donor", name: "Super Major Donor",
once_amount: 2500, once_amount: 2500,
monthly_amount: 250, monthly_amount: 250,
annually_amount: 2500 annually_amount: 2500,
}, },
{ {
id: 2, id: 2,
name: "Major Donor", name: "Major Donor",
once_amount: 1000, once_amount: 1000,
monthly_amount: 100, monthly_amount: 100,
annually_amount: 1000 annually_amount: 1000,
}, },
{ {
id: 3, id: 3,
name: "Rare Earths Level", name: "Rare Earths Level",
once_amount: 500, once_amount: 500,
monthly_amount: 50, monthly_amount: 50,
annually_amount: 500 annually_amount: 500,
}, },
{ {
id: 4, id: 4,
name: "Titanium Level", name: "Titanium Level",
once_amount: 250, once_amount: 250,
monthly_amount: 25, monthly_amount: 25,
annually_amount: 250 annually_amount: 250,
}, },
{ {
id: 5, id: 5,
name: "Gold Level", name: "Gold Level",
once_amount: 100, once_amount: 100,
monthly_amount: 20, monthly_amount: 20,
annually_amount: 100 annually_amount: 100,
}, },
{ {
id: 6, id: 6,
name: "Copper Level", name: "Copper Level",
once_amount: 50, once_amount: 50,
monthly_amount: 10, monthly_amount: 10,
annually_amount: 50 annually_amount: 50,
} },
] ],
}; };
}, },
computed: { computed: {
activeCurrency() { activeCurrency() {
const itemIndex = this.currencies.findIndex( const itemIndex = this.currencies.findIndex(
item => item.code === this.currency (item) => item.code === this.currency
); );
if (itemIndex === -1) return false; if (itemIndex === -1) return false;
return this.currencies[itemIndex]; return this.currencies[itemIndex];
@ -482,7 +577,7 @@ export default {
return document return document
.querySelector('meta[name="csrf-token"]') .querySelector('meta[name="csrf-token"]')
.getAttribute("content"); .getAttribute("content");
} },
}, },
methods: { methods: {
setFrequency(code) { setFrequency(code) {
@ -495,7 +590,7 @@ export default {
}, },
setAmountByPackage() { setAmountByPackage() {
const itemIndex = this.donationPackages.findIndex( const itemIndex = this.donationPackages.findIndex(
item => item.id === this.donationPackage (item) => item.id === this.donationPackage
); );
if (itemIndex !== -1) { if (itemIndex !== -1) {
if (this.frequency == "once") { if (this.frequency == "once") {
@ -514,14 +609,20 @@ export default {
// 46 is dot // 46 is dot
$event.preventDefault(); $event.preventDefault();
} }
} },
}, },
watch: { watch: {
amount() { amount() {
if (this.amount < 1) { if (this.amount < 1) {
this.amount = 5; this.amount = 5;
} }
} },
} },
mounted() {
axios.get("/captcha/api/math").then((response) => {
this.captcha_src = response.data.img;
this.captcha_key = response.data.key;
});
},
}; };
</script> </script>

Loading…
Cancel
Save