Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 76ae35217c | |||
| fe651fa38e | |||
| f7b8c0c0fe | |||
| 4af3cc2486 | |||
| 3632b936e9 |
@@ -14,6 +14,7 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
new_version: ${{ steps.version.outputs.new_version }}
|
new_version: ${{ steps.version.outputs.new_version }}
|
||||||
version_changed: ${{ steps.version.outputs.version_changed }}
|
version_changed: ${{ steps.version.outputs.version_changed }}
|
||||||
|
component_changed: ${{ steps.version.outputs.component_changed }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@@ -30,15 +31,104 @@ jobs:
|
|||||||
git config --global user.name 'Gitea Actions Bot'
|
git config --global user.name 'Gitea Actions Bot'
|
||||||
git config --global user.email 'actions@gitea.local'
|
git config --global user.email 'actions@gitea.local'
|
||||||
|
|
||||||
- name: Bump version
|
- name: Detect changes and bump version
|
||||||
id: version
|
id: version
|
||||||
run: |
|
run: |
|
||||||
# Get current version from backend package.json
|
set -e # Exit on error
|
||||||
CURRENT_VERSION=$(node -p "require('./backend/package.json').version")
|
|
||||||
echo "Current version: $CURRENT_VERSION"
|
|
||||||
|
|
||||||
# Split version into parts
|
echo "=== Debug Info ==="
|
||||||
IFS='.' read -r -a version_parts <<< "$CURRENT_VERSION"
|
echo "GitHub event before: ${{ github.event.before }}"
|
||||||
|
echo "GitHub SHA: ${{ github.sha }}"
|
||||||
|
echo "Current directory: $(pwd)"
|
||||||
|
echo "Git log (last 5): $(git log --oneline -5)"
|
||||||
|
|
||||||
|
# Get the commit range for changed files
|
||||||
|
if [ "${{ github.event.before }}" != "0000000000000000000000000000000000000000" ] && [ "${{ github.event.before }}" != "" ]; then
|
||||||
|
COMMIT_RANGE="${{ github.event.before }}..${{ github.sha }}"
|
||||||
|
echo "Using commit range: $COMMIT_RANGE"
|
||||||
|
CHANGED_FILES=$(git diff --name-only $COMMIT_RANGE || echo "")
|
||||||
|
else
|
||||||
|
# First commit or no previous commit, check against HEAD~1 if it exists
|
||||||
|
if git rev-parse HEAD~1 >/dev/null 2>&1; then
|
||||||
|
COMMIT_RANGE="HEAD~1..HEAD"
|
||||||
|
echo "Using commit range: $COMMIT_RANGE"
|
||||||
|
CHANGED_FILES=$(git diff --name-only $COMMIT_RANGE || echo "")
|
||||||
|
else
|
||||||
|
echo "First commit detected, checking all files"
|
||||||
|
CHANGED_FILES=$(git ls-files)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Changed files:"
|
||||||
|
echo "$CHANGED_FILES"
|
||||||
|
|
||||||
|
# Check what changed (using echo to pipe to grep to avoid grep exit codes)
|
||||||
|
BACKEND_CHANGED=$(echo "$CHANGED_FILES" | grep -c '^backend/' || echo "0")
|
||||||
|
FRONTEND_CHANGED=$(echo "$CHANGED_FILES" | grep -c '^frontend/' || echo "0")
|
||||||
|
ROOT_CHANGED=$(echo "$CHANGED_FILES" | grep -c -E '^(package\.json|docker-compose|Dockerfile|scripts/)' || echo "0")
|
||||||
|
|
||||||
|
echo "Backend files changed: $BACKEND_CHANGED"
|
||||||
|
echo "Frontend files changed: $FRONTEND_CHANGED"
|
||||||
|
echo "Root files changed: $ROOT_CHANGED"
|
||||||
|
|
||||||
|
# Get current versions
|
||||||
|
BACKEND_VERSION=$(node -p "require('./backend/package.json').version" 2>/dev/null || echo "1.0.0")
|
||||||
|
FRONTEND_VERSION=$(node -p "require('./frontend/package.json').version" 2>/dev/null || echo "1.0.0")
|
||||||
|
|
||||||
|
echo "Current backend version: $BACKEND_VERSION"
|
||||||
|
echo "Current frontend version: $FRONTEND_VERSION"
|
||||||
|
|
||||||
|
# Determine what to update based on changes
|
||||||
|
BACKEND_UPDATE=false
|
||||||
|
FRONTEND_UPDATE=false
|
||||||
|
COMPONENT_CHANGED="none"
|
||||||
|
|
||||||
|
if [ "$ROOT_CHANGED" -gt 0 ]; then
|
||||||
|
# Root changes affect both components
|
||||||
|
BACKEND_UPDATE=true
|
||||||
|
FRONTEND_UPDATE=true
|
||||||
|
COMPONENT_CHANGED="both"
|
||||||
|
SOURCE_VERSION=$BACKEND_VERSION
|
||||||
|
echo "Root changes detected - updating both components"
|
||||||
|
elif [ "$BACKEND_CHANGED" -gt 0 ] && [ "$FRONTEND_CHANGED" -gt 0 ]; then
|
||||||
|
# Both components changed
|
||||||
|
BACKEND_UPDATE=true
|
||||||
|
FRONTEND_UPDATE=true
|
||||||
|
COMPONENT_CHANGED="both"
|
||||||
|
# Use the higher version as source
|
||||||
|
if [ "$(printf '%s\n' "$BACKEND_VERSION" "$FRONTEND_VERSION" | sort -V | tail -n1)" = "$BACKEND_VERSION" ]; then
|
||||||
|
SOURCE_VERSION=$BACKEND_VERSION
|
||||||
|
else
|
||||||
|
SOURCE_VERSION=$FRONTEND_VERSION
|
||||||
|
fi
|
||||||
|
echo "Both backend and frontend changed - updating both"
|
||||||
|
elif [ "$BACKEND_CHANGED" -gt 0 ]; then
|
||||||
|
# Only backend changed
|
||||||
|
BACKEND_UPDATE=true
|
||||||
|
COMPONENT_CHANGED="backend"
|
||||||
|
SOURCE_VERSION=$BACKEND_VERSION
|
||||||
|
echo "Only backend changed - updating backend"
|
||||||
|
elif [ "$FRONTEND_CHANGED" -gt 0 ]; then
|
||||||
|
# Only frontend changed
|
||||||
|
FRONTEND_UPDATE=true
|
||||||
|
COMPONENT_CHANGED="frontend"
|
||||||
|
SOURCE_VERSION=$FRONTEND_VERSION
|
||||||
|
echo "Only frontend changed - updating frontend"
|
||||||
|
else
|
||||||
|
echo "No relevant changes detected"
|
||||||
|
echo "version_changed=false" >> $GITHUB_OUTPUT
|
||||||
|
echo "component_changed=none" >> $GITHUB_OUTPUT
|
||||||
|
echo "new_version=" >> $GITHUB_OUTPUT
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Component changed: $COMPONENT_CHANGED"
|
||||||
|
echo "Source version: $SOURCE_VERSION"
|
||||||
|
echo "Backend update: $BACKEND_UPDATE"
|
||||||
|
echo "Frontend update: $FRONTEND_UPDATE"
|
||||||
|
|
||||||
|
# Calculate new version
|
||||||
|
IFS='.' read -r -a version_parts <<< "$SOURCE_VERSION"
|
||||||
MAJOR="${version_parts[0]}"
|
MAJOR="${version_parts[0]}"
|
||||||
MINOR="${version_parts[1]}"
|
MINOR="${version_parts[1]}"
|
||||||
PATCH="${version_parts[2]}"
|
PATCH="${version_parts[2]}"
|
||||||
@@ -49,14 +139,23 @@ jobs:
|
|||||||
|
|
||||||
echo "New version: $NEW_VERSION"
|
echo "New version: $NEW_VERSION"
|
||||||
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
echo "component_changed=$COMPONENT_CHANGED" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
# Update version in package.json files
|
# Update versions in package.json files
|
||||||
cd backend && npm version $NEW_VERSION --no-git-tag-version
|
if [ "$BACKEND_UPDATE" = true ]; then
|
||||||
cd ../frontend && npm version $NEW_VERSION --no-git-tag-version
|
echo "Updating backend version to $NEW_VERSION"
|
||||||
cd ..
|
cd backend && npm version $NEW_VERSION --no-git-tag-version
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if there are changes
|
if [ "$FRONTEND_UPDATE" = true ]; then
|
||||||
if [[ -n $(git status -s) ]]; then
|
echo "Updating frontend version to $NEW_VERSION"
|
||||||
|
cd frontend && npm version $NEW_VERSION --no-git-tag-version
|
||||||
|
cd ..
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if there are changes to commit
|
||||||
|
if [[ -n $(git status --porcelain) ]]; then
|
||||||
echo "version_changed=true" >> $GITHUB_OUTPUT
|
echo "version_changed=true" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "version_changed=false" >> $GITHUB_OUTPUT
|
echo "version_changed=false" >> $GITHUB_OUTPUT
|
||||||
@@ -65,15 +164,36 @@ jobs:
|
|||||||
- name: Commit version bump
|
- name: Commit version bump
|
||||||
if: steps.version.outputs.version_changed == 'true'
|
if: steps.version.outputs.version_changed == 'true'
|
||||||
run: |
|
run: |
|
||||||
git add backend/package.json backend/package-lock.json
|
COMPONENT="${{ steps.version.outputs.component_changed }}"
|
||||||
git add frontend/package.json frontend/package-lock.json
|
|
||||||
git commit -m "chore: bump version to ${{ steps.version.outputs.new_version }}"
|
if [ "$COMPONENT" = "both" ]; then
|
||||||
|
git add backend/package.json backend/package-lock.json
|
||||||
|
git add frontend/package.json frontend/package-lock.json
|
||||||
|
git commit -m "chore: bump version to ${{ steps.version.outputs.new_version }} (backend + frontend)"
|
||||||
|
elif [ "$COMPONENT" = "backend" ]; then
|
||||||
|
git add backend/package.json backend/package-lock.json
|
||||||
|
git commit -m "chore: bump backend version to ${{ steps.version.outputs.new_version }}"
|
||||||
|
elif [ "$COMPONENT" = "frontend" ]; then
|
||||||
|
git add frontend/package.json frontend/package-lock.json
|
||||||
|
git commit -m "chore: bump frontend version to ${{ steps.version.outputs.new_version }}"
|
||||||
|
fi
|
||||||
|
|
||||||
git push
|
git push
|
||||||
|
|
||||||
- name: Create Git tag
|
- name: Create Git tag
|
||||||
if: steps.version.outputs.version_changed == 'true'
|
if: steps.version.outputs.version_changed == 'true'
|
||||||
run: |
|
run: |
|
||||||
git tag -a "v${{ steps.version.outputs.new_version }}" -m "Release v${{ steps.version.outputs.new_version }}"
|
COMPONENT="${{ steps.version.outputs.component_changed }}"
|
||||||
|
|
||||||
|
if [ "$COMPONENT" = "both" ]; then
|
||||||
|
TAG_MESSAGE="Release v${{ steps.version.outputs.new_version }} (backend + frontend)"
|
||||||
|
elif [ "$COMPONENT" = "backend" ]; then
|
||||||
|
TAG_MESSAGE="Release v${{ steps.version.outputs.new_version }} (backend)"
|
||||||
|
elif [ "$COMPONENT" = "frontend" ]; then
|
||||||
|
TAG_MESSAGE="Release v${{ steps.version.outputs.new_version }} (frontend)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
git tag -a "v${{ steps.version.outputs.new_version }}" -m "$TAG_MESSAGE"
|
||||||
git push origin "v${{ steps.version.outputs.new_version }}"
|
git push origin "v${{ steps.version.outputs.new_version }}"
|
||||||
|
|
||||||
trigger-drone:
|
trigger-drone:
|
||||||
@@ -84,5 +204,6 @@ jobs:
|
|||||||
- name: Trigger Drone Build
|
- name: Trigger Drone Build
|
||||||
run: |
|
run: |
|
||||||
echo "Version bumped to ${{ needs.version-bump.outputs.new_version }}"
|
echo "Version bumped to ${{ needs.version-bump.outputs.new_version }}"
|
||||||
|
echo "Component(s) changed: ${{ needs.version-bump.outputs.component_changed }}"
|
||||||
echo "Drone will automatically trigger on the new tag"
|
echo "Drone will automatically trigger on the new tag"
|
||||||
# Drone CI will automatically trigger on the tag push event
|
# Drone CI will automatically trigger on the tag push event
|
||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "picpeak-backend",
|
"name": "picpeak-backend",
|
||||||
"version": "1.0.44",
|
"version": "1.0.46",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "picpeak-backend",
|
"name": "picpeak-backend",
|
||||||
"version": "1.0.44",
|
"version": "1.0.46",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"adm-zip": "^0.5.16",
|
"adm-zip": "^0.5.16",
|
||||||
"archiver": "^5.3.1",
|
"archiver": "^5.3.1",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "picpeak-backend",
|
"name": "picpeak-backend",
|
||||||
"version": "1.0.44",
|
"version": "1.0.46",
|
||||||
"description": "Backend for PicPeak event photo sharing platform",
|
"description": "Backend for PicPeak event photo sharing platform",
|
||||||
"main": "server.js",
|
"main": "server.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -66,7 +66,12 @@ router.post('/', adminAuth, [
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generate unique slug
|
// Generate unique slug
|
||||||
const baseSlug = `${event_type}-${event_name.toLowerCase().replace(/[^a-z0-9]/g, '-')}-${event_date}`;
|
const processedEventName = event_name
|
||||||
|
.toLowerCase()
|
||||||
|
.replace(/[^a-z0-9]/g, '-') // Replace non-alphanumeric with dash
|
||||||
|
.replace(/-+/g, '-') // Replace multiple dashes with single dash
|
||||||
|
.replace(/^-|-$/g, ''); // Remove leading/trailing dashes
|
||||||
|
const baseSlug = `${event_type}-${processedEventName}-${event_date}`;
|
||||||
let slug = baseSlug;
|
let slug = baseSlug;
|
||||||
let counter = 1;
|
let counter = 1;
|
||||||
|
|
||||||
@@ -388,13 +393,56 @@ router.delete('/:id', adminAuth, async (req, res) => {
|
|||||||
return res.status(404).json({ error: 'Event not found' });
|
return res.status(404).json({ error: 'Event not found' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete associated photos
|
// Start a transaction to ensure all deletions succeed or fail together
|
||||||
await db('photos').where('event_id', id).del();
|
await db.transaction(async (trx) => {
|
||||||
|
// 1. Delete activity logs (audit trail)
|
||||||
|
await trx('activity_logs').where('event_id', id).del();
|
||||||
|
|
||||||
// Delete event
|
// 2. Delete access logs
|
||||||
await db('events').where('id', id).del();
|
await trx('access_logs').where('event_id', id).del();
|
||||||
|
|
||||||
// Log activity
|
// 3. Delete email queue entries
|
||||||
|
await trx('email_queue').where('event_id', id).del();
|
||||||
|
|
||||||
|
// 4. Delete photos (this will also handle hero_photo_id foreign key)
|
||||||
|
await trx('photos').where('event_id', id).del();
|
||||||
|
|
||||||
|
// 5. Delete categories (photo_categories has CASCADE delete for event_id)
|
||||||
|
await trx('photo_categories').where('event_id', id).del();
|
||||||
|
|
||||||
|
// 6. Finally delete the event
|
||||||
|
await trx('events').where('id', id).del();
|
||||||
|
|
||||||
|
// Delete event folder from storage if it exists
|
||||||
|
if (event.folder_path) {
|
||||||
|
const storagePath = process.env.STORAGE_PATH || path.join(__dirname, '../../../storage');
|
||||||
|
const eventFolderPath = path.join(storagePath, 'events', 'active', event.folder_path);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const fsPromises = require('fs').promises;
|
||||||
|
await fsPromises.rm(eventFolderPath, { recursive: true, force: true });
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Failed to delete event folder:', err);
|
||||||
|
// Don't fail the transaction if folder deletion fails
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete archive if exists
|
||||||
|
if (event.archive_path) {
|
||||||
|
const storagePath = process.env.STORAGE_PATH || path.join(__dirname, '../../../storage');
|
||||||
|
const archivePath = path.join(storagePath, event.archive_path);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const fsPromises = require('fs').promises;
|
||||||
|
await fsPromises.unlink(archivePath);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Failed to delete archive file:', err);
|
||||||
|
// Don't fail the transaction if file deletion fails
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Log activity (outside transaction)
|
||||||
await logActivity('event_deleted',
|
await logActivity('event_deleted',
|
||||||
{ event_name: event.event_name },
|
{ event_name: event.event_name },
|
||||||
null,
|
null,
|
||||||
@@ -404,7 +452,19 @@ router.delete('/:id', adminAuth, async (req, res) => {
|
|||||||
res.json({ message: 'Event deleted successfully' });
|
res.json({ message: 'Event deleted successfully' });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error deleting event:', error);
|
console.error('Error deleting event:', error);
|
||||||
res.status(500).json({ error: 'Failed to delete event' });
|
|
||||||
|
// Provide more specific error messages
|
||||||
|
if (error.message && error.message.includes('foreign key constraint')) {
|
||||||
|
res.status(500).json({
|
||||||
|
error: 'Cannot delete event due to existing references. Please contact support.',
|
||||||
|
details: error.message
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
res.status(500).json({
|
||||||
|
error: 'Failed to delete event',
|
||||||
|
details: process.env.NODE_ENV === 'development' ? error.message : undefined
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "picpeak-frontend",
|
"name": "picpeak-frontend",
|
||||||
"version": "1.0.44",
|
"version": "1.0.45",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "picpeak-frontend",
|
"name": "picpeak-frontend",
|
||||||
"version": "1.0.44",
|
"version": "1.0.45",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/react-query": "^5.0.0",
|
"@tanstack/react-query": "^5.0.0",
|
||||||
"@tiptap/extension-link": "^2.25.0",
|
"@tiptap/extension-link": "^2.25.0",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "picpeak-frontend",
|
"name": "picpeak-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.44",
|
"version": "1.0.45",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
Reference in New Issue
Block a user