feat: Refine notice filtering and Docker setup
Implement granular notice filtering logic based on user roles and notice targeting. Update Dockerfiles and .dockerignore for a cleaner build process.
This commit is contained in:
BIN
.dockerignore
BIN
.dockerignore
Binary file not shown.
15
Dockerfile
15
Dockerfile
@@ -1,15 +0,0 @@
|
||||
# Stage 1: Build Frontend
|
||||
FROM node:18-alpine as build
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Stage 2: Serve with Nginx
|
||||
FROM nginx:alpine
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
# Copy the nginx configuration file (using the .txt extension as provided in source)
|
||||
COPY nginx.txt /etc/nginx/nginx.conf
|
||||
EXPOSE 80
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
|
||||
38
nginx.conf
38
nginx.conf
@@ -1,38 +0,0 @@
|
||||
worker_processes 1;
|
||||
|
||||
events { worker_connections 1024; }
|
||||
|
||||
http {
|
||||
include mime.types;
|
||||
default_type application/octet-stream;
|
||||
sendfile on;
|
||||
keepalive_timeout 65;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
|
||||
# Limite upload per allegati (es. foto/video ticket) - Allineato con il backend
|
||||
client_max_body_size 50M;
|
||||
|
||||
# Compressione Gzip
|
||||
gzip on;
|
||||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||||
|
||||
# Gestione SPA (React Router)
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
# Proxy API verso il backend
|
||||
location /api/ {
|
||||
proxy_pass http://backend:3001;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,12 +30,29 @@ export const FamilyList: React.FC = () => {
|
||||
setSettings(appSettings);
|
||||
|
||||
if (condo && currentUser && appSettings.features.notices) {
|
||||
const condoNotices = allNotices.filter(n => n.condoId === condo.id && n.active);
|
||||
// Filter notices logic:
|
||||
// 1. Must belong to current condo and be active
|
||||
// 2. If Admin/PowerUser -> See everything
|
||||
// 3. If standard User -> See Public notices (no target) OR Targeted notices containing their familyId
|
||||
const isPrivileged = currentUser.role === 'admin' || currentUser.role === 'poweruser';
|
||||
|
||||
const condoNotices = allNotices.filter(n => {
|
||||
if (n.condoId !== condo.id || !n.active) return false;
|
||||
|
||||
if (isPrivileged) return true;
|
||||
|
||||
// Check targeting
|
||||
const hasTargets = n.targetFamilyIds && n.targetFamilyIds.length > 0;
|
||||
if (!hasTargets) return true; // Public to all
|
||||
|
||||
return currentUser.familyId && n.targetFamilyIds?.includes(currentUser.familyId);
|
||||
});
|
||||
|
||||
setNotices(condoNotices);
|
||||
|
||||
// Check which ones are read
|
||||
const readStatuses = await Promise.all(condoNotices.map(n => CondoService.getNoticeReadStatus(n.id)));
|
||||
const readIds = [];
|
||||
const readIds: string[] = [];
|
||||
readStatuses.forEach((reads, idx) => {
|
||||
if (reads.find(r => r.userId === currentUser.id)) {
|
||||
readIds.push(condoNotices[idx].id);
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
FROM node:18-alpine
|
||||
WORKDIR /app
|
||||
|
||||
# Set production environment
|
||||
ENV NODE_ENV=production
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm install --production
|
||||
|
||||
COPY . .
|
||||
|
||||
EXPOSE 3001
|
||||
CMD ["node", "server.js"]
|
||||
|
||||
Reference in New Issue
Block a user