Joinify facilitates the management of clubs, members, payments, and events within an academic or organizational setting. It supports a robust role-based access system and automates administrative workflows like membership validation, event organization, and payment tracking.
email: admin@gmail.com
password: admin@gmail.com
email: president@gmail.com
password: president@gmail.com
email: secretary@gmail.com
password: secretary@gmail.com
email: accountant@gmail.com
password: accountant@gmail.com
git clone https://github.com/masum184e/joinify.git
cd joinify
# Install PHP dependencies
composer install
# Set up environment
cp .env.example .env
php artisan key:generate
# Configure database in .env and run migrations
php artisan migrate
# Optional: Seed the database
php artisan db:seed
# Serve the application
php artisan serve
# Database configuration
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=joinify
DB_USERNAME=root
DB_PASSWORD=
# Default password for seeding
DEFAULT_USER_PASSWORD=defaultPassword123
# SSLCommerz Payment Gateway credentials
SSLCZ_STORE_ID=abcdefghijklmnopqrstuvwxyz
SSLCZ_STORE_PASSWORD=abcdefghijklmnopqrstuvwxyz@ssl
SSLCZ_TESTMODE=true
Basic user details (name, email, password, profile_picture)
- Global Role (e.g., Advisor)
- Member (student info)
- Club roles (President, Secretary, Accountant)
- Advisor
- President
- Secretary
- Accountant
- Name, description
- Related to members, events, and club-based roles
- Links a member to a club
- Enforces uniqueness of member per club
- Tracks membership payments
- Status: pending, paid, failed
- Belongs to a club
- Contains event details like title, schedule, location
- Can be invited to events
- Linked through a many-to-many table with events
-
Users
- hasOne user_global_roles
- hasMany club_user_roles
- hasOne member
-
User Global Roles
- belongsTo user
-
Clubs
- hasMany club_user_roles
- hasMany memberships
- hasMany events
-
Club User Roles
- belongsTo club
- belongsTo user
-
Members
- belongsTo user
- hasMany memberships
-
Memberships
- belongsTo member
- belongsTo club
- hasOne payment
-
Payments
- belongsTo membership
-
Events
- belongsTo club
- hasMany event_guests
-
Guests
- hasMany event_guests
-
Event Guests
- belongsTo event
- belongsTo guest
Relationship | Type | One Side | Many Side |
---|---|---|---|
User ↔ UserGlobalRole | One-to-One | User | UserGlobalRole |
User → ClubUserRole | One-to-Many | User | ClubUserRole |
Club → ClubUserRole | One-to-Many | Club | ClubUserRole |
User ↔ Member | One-to-One | User | Member |
Member → Membership | One-to-Many | Member | Membership |
Club → Membership | One-to-Many | Club | Membership |
Membership ↔ Payment | One-to-One | Membership | Payment |
Club → Event | One-to-Many | Club | Event |
Event → EventGuest | One-to-Many | Event | EventGuest |
Guest → EventGuest | One-to-Many | Guest | EventGuest |
Event ↔ Guest | Many-to-Many | Event | Guest |
- View all clubs and memberships
- Validate and manage club roles
- Monitor payments and memberships
- Manage all users and assign roles
- Manage club details
- Add and approve members
- Organize events and invite guests
- Track and verify payments
- Join clubs
- View upcoming events
- Pay membership dues
- Request role or submit reasons for joining
- Club admins (President, Accountant) can view a full list of members.
- Each member is linked to a user account and includes student information like department and student ID.
- Members are associated with clubs through Memberships.
- Public Event Views: Anyone can view public listings and details of events for a club.
- Admin Event Dashboard:
- Only secretaries or presidents can access the dashboard to:
- Create, view, edit, or delete events.
- Manage guest invitations per event.
- Only secretaries or presidents can access the dashboard to:
- Guests can be added to events by name and email (optional).
- Events support full CRUD operations.
- Guests are linked to events via a pivot table.
- Reusable guest records are created by email when provided.
-
New users can register as members and initiate payment for membership fees.
-
Integration with SSLCommerz allows real-time payment processing.
-
Payment flow:
- Creates a User, Member, Membership, and pending Payment record.
- Redirects to SSLCommerz hosted gateway for payment.
- Handles success, fail, and cancel callbacks.
-
Default payment amount is 123 BDT.
- Controlled by
HomeController.index
. - It shows verified popular clubs dynamically.
- Allow only
GET
method.
$popularClubs = Club::withCount('memberships','userRoles')
withCount('memberships', 'userRoles')
will add two extra columns to the resultmemberships_count
,user_roles_count
->orderBy('memberships_count', 'desc')
- sorts the clubs in descending order of their membership count.->take(3)
- Limits the result to the top 3 clubs->get()
- Executes the query
- Controller by
ClubController.publicIndex
. - It shows all verified clubs(ID, Name, Description, Fee, Banner, Created At).
- Allow only
GET
method. select
will be fetched only the specific fields.
- Controlled by
ClubController.show
. - It shows a specific verified club (ID, Name, Description, Fee, Banner, Created At) details.
- Allow only
GET
method. findOrFail($clubId)
- Looks for a club with the given ID. If not found, automatically throws a 404 error.abort(404)
- sends a Not Found response.
- Controlled by
ClubController.joinClub
. - It shows joining form of a verified club(shows).
- Allow only
GET
method.
- Controlled by
SslCommerzPaymentController.index
. - Allow only
POST
method. - It redirect to
SslCommerz
and show payment UI. - It store member details and set payment status
pending
and redirect to/success
or/fail
or/cancel
.
- Controlled by
SslCommerzPaymentController.success
. - Allow only
POST
method. - It shows the succeded payment details with transaction id.
- It ignore the csrf token verification.
- Controlled by
SslCommerzPaymentController.fail
. - Allow only
POST
method. - It shows the failed status.
- It ignore the csrf token verification.
- Controlled by
SslCommerzPaymentController.cancel
. - Allow only
POST
method. - It shows the cancelled status.
- It ignore the csrf token verification.
- Controlled by
AuthController.index
(GET
) andAuthController.login
(POST
). - It shows and handle login form.
- Allow both
GET
andPOST
method. $request->only
method passes only the email and password to theattempt()
method.Auth::attempt()
checks if the email and password match a user in the database.
- Controlled by
AuthController.logout
- It show nothing just remove the authentication session.
- Allow only
GET
method. Auth::logout();
logs the user out by removing their authentication data from the session.invalidate()
clears all session data, making sure any old session information is discarded.regenerateToken()
generates a new CSRF token to help prevent session fixation attacks.
- Controlled by
ClubController.index
- It shows all the club(both verified and non-verified) list to authorized
advisor
. - Allow only
GET
method.
- Controlled by
ClubController.create
- It shows club creation form only to authorized
advisor
- Allow only
GET
method.
- Controlled by
ClubController.edit
- It shows club updation form as well as existing club details only to authorized
advisor
- Allow only
GET
method.
- Allow
GET
,POST
,DELETE
,PUT
method
- Controlled by
ClubController.show
- It only allow for
Authorized
Advisor
- It shows club details icluding membership count and club revenue
- Controlled by
ClubController.store
- It only allow for
Authorized
Advisor
- Store executives credentials first, then club details and assign executives role. If error occured, it remove the uploaded club banner
- Controlled by
ClubController.update
- It only allow for
Authorized
Advisor
- It just update the modifed value, keep everything as it is
- Controlled by
ClubController.destroy
- It only allow for
Authorized
Advisor
- Before removing club details, it remove the club banner first
- Forget password, remember me.
- Upload club banner by president.
- Update club fee by accountant.
- Send club creation invitation to president, secretary, accountant email and verify them.
- User settings.
- Remove guest during update guest.
- when advisor update executives member, it's email should changed as well as verified status.
- Implement event schedule handling feature.
- Show events sorted order.
- Show event guests list.
- Show guest name during editing event information.