User
у меня есть код. Мне нужно, используя паттерн медиатор, разграничить доступ для двух ролей. Первая роль - метеозаинтересованный, он может пользоваться только командой /weather. Вторая роль - синоптик, он может пользоваться всеми командами.

package org.example.model;

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import org.example.DB.Weather;
import org.example.DB.WeatherDAOPost;
import org.json.JSONObject;
import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.TelegramBotsApi;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Message;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import org.telegram.telegrambots.updatesreceivers.DefaultBotSession;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

    /**
     @author hypec
     @version 1.0.1
     @since 04-05-2023
     */

public class WeatherBot extends TelegramLongPollingBot {

    /** Поле инициализации объекта базы данных */
    WeatherDAOPost weatherDAOImpl = new WeatherDAOPost();

        /**
         * Главная процедура, инициализирющая и регистрирующая бота
         * @param args
         */
    public static void main(String[] args) {
        WeatherBot bot = new WeatherBot();
        try {
            TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
            botsApi.registerBot(bot);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }

        /**
         * Процедура обновления данных в чате
         * @param update
         */
    @Override
    public void onUpdateReceived(Update update) {
        if (update.hasMessage() && update.getMessage().hasText()) {
            String text = update.getMessage().getText();
            Message inMess = update.getMessage();
            String chatId = inMess.getChatId().toString();

            if (text.equals("/start")){
                if (text.startsWith("/start")) {
                    SendMessage messageToSend = new SendMessage();
                    messageToSend.setChatId(chatId);
                    messageToSend.setText("Добро пожаловать в чат бота Погода!\nВыберите соответствующиую опцию:");

                    ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup();
                    keyboardMarkup.setSelective(true);
                    keyboardMarkup.setResizeKeyboard(true);
                    keyboardMarkup.setOneTimeKeyboard(true); // отключение выбора элементов(только на телефоне)
                    List<KeyboardRow> keyboard = new ArrayList<>();
                    KeyboardRow row = new KeyboardRow();
                    row.add(new KeyboardButton("/db"));
                    keyboard.add(row);
                    row = new KeyboardRow();
                    row.add(new KeyboardButton("/help"));
                    keyboard.add(row);
                    row = new KeyboardRow();
                    row.add(new KeyboardButton("/start"));
                    keyboard.add(row);
                    keyboardMarkup.setKeyboard(keyboard);

                    messageToSend.setReplyMarkup(keyboardMarkup);

                    try {
                        execute(messageToSend);
                    } catch (TelegramApiException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
            else if (text.startsWith("/weather")) {
                String location = text.substring(9);
                try {
                    String url = String.format("http://api.openweathermap.org/data/2.5/weather?q=%s&appid=%s&exclude=current&lang=ru&units=metric", location, "0dbfa25f5196a0447e750e1ac30e86ba");
                    CloseableHttpClient client = HttpClientBuilder.create().build();
                    HttpGet request = new HttpGet(url);
                    JSONObject response = new JSONObject(EntityUtils.toString(client.execute(request).getEntity()));
                    //System.out.println("API Response: " + response.toString()); // дебаг HTTP запроса
                    String description = response.getJSONArray("weather").getJSONObject(0).getString("description");
                    double temperature = response.getJSONObject("main").getDouble("temp");
                    String temperatureString = String.format("%.1f", temperature);

                    SendMessage messageToSend = new SendMessage();

                    messageToSend.setChatId(chatId);
                    messageToSend.setText("Погода в городе " + location + " - " + description + "\nТемпература равна:  " + temperatureString + " °C");

                    String name2 = location;
                    String description2 = description;
                    String temp2 = temperatureString;
                    LocalDateTime now = LocalDateTime.now();
                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                    String time = now.format(formatter);

                    weatherDAOImpl.addWeather(new Weather(0, name2, description2, temp2, time));

                    execute(messageToSend);
                } catch (Exception e) {
                    //System.out.println("ошибка в : " + e.getMessage()); // дебаг переменной с температурой
                    SendMessage messageToSend = new SendMessage();
                    messageToSend.setChatId(chatId);
                    messageToSend.setText("Извините, информации по  местоположению "+ location + " нету!");
                    try {
                        execute(messageToSend);
                    } catch (TelegramApiException ex) {
                        throw new RuntimeException(ex);
                    }
                }
            }
            else if (text.equals("/db")) {
                List<Weather> weathers = weatherDAOImpl.getAllWeathers();
                StringBuilder sb = new StringBuilder();
                sb.append("Погода в базе данных:\n");
                for (Weather weather : weathers) {
                    sb.append(weather.getName()).append(" - ").append(weather.getDescription()).append(", температура: ").append(weather.getTemperature()).append(" °C, время запроса: ").append(weather.getTime()).append("\n");
                }
                SendMessage messageToSend = new SendMessage();
                messageToSend.setChatId(chatId);
                messageToSend.setText(sb.toString());
                try {
                    execute(messageToSend);
                } catch (TelegramApiException e) {
                    throw new RuntimeException(e);
                }

            } else if (text.equals("/help")) {
                SendMessage messageToSend = new SendMessage();
                messageToSend.setChatId(chatId);
                messageToSend.setText("Для получения погоды, необходимо ввести /weather и название города\n" +
                        "для получения всей информации из базы, надо ввести /db\n"+
                        "для получения информации по средней температуре в городе из базы, необходимо ввести /dbavg и название города");
                try {
                    execute(messageToSend);
                } catch (TelegramApiException e) {
                    throw new RuntimeException(e);
                }
            }
            else if (text.startsWith("/dbavg")) {
                String city = text.substring(7);
                double averageTemperature = weatherDAOImpl.getAverageTemperatureByCity(city);
                String response = city + " - средняя температура - " + averageTemperature;

                SendMessage messageToSend = new SendMessage();
                messageToSend.setChatId(chatId);
                messageToSend.setText(response);

                try {
                    execute(messageToSend);
                } catch (TelegramApiException e) {
                    throw new RuntimeException(e);
                }
            }

        }
        }

        /**
         * Функция получения значения поля BotUsername
         * @return
         */
    @Override
    public String getBotUsername() {
        return "kursprojectbot";
    }

        /**
         * Функция получения значения поля BotToken
         * @return
         */
    @Override
    public String getBotToken() {
        return "6033289169:AAFsWsdRn2Hc-G-V5L9OewZIEzyLO7wsoP0";
    }
}

package org.example.DB;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class WeatherDAOPost implements WeatherDAO {
    private Connection conn;

    public WeatherDAOPost() {

        try {
            conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/weather", "postgres", "Nd31012001");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    @Override
    public List<Weather> getAllWeathers() {
        List<Weather> tasks = new ArrayList<>();
        try {
            PreparedStatement ps = conn.prepareStatement("SELECT * FROM weather");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                Weather task = new Weather(rs.getInt("id"),
                        //rs.getInt("id");
                        rs.getString("name"),
                        rs.getString("description"),
                        rs.getString("temp"),
                        rs.getString("time"));
                tasks.add(task);

            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return tasks;
    }

    @Override
    public Weather getWeatherById(int id) {
        Weather task = null;
        try {
            PreparedStatement ps = conn.prepareStatement("SELECT * FROM weather WHERE id = ?");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                Weather weather = new Weather(rs.getInt("id"),
                        //rs.getInt("id");
                        rs.getString("name"),
                        rs.getString("description"),
                        rs.getString("temp"),
                        rs.getString("time"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return task;
    }

    @Override
    public void addWeather(Weather weather) {
        try {
            PreparedStatement ps = conn.prepareStatement("INSERT INTO weather (name, description, temp, time) VALUES (?, ?, ?, ?)");
            ps.setString(1, weather.getName());
            ps.setString(2, weather.getDescription());
            ps.setString(3, weather.getTemperature());
            ps.setString(4,weather.getTime());
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void updateWeather(Weather weather) {
        try {
            PreparedStatement ps = conn.prepareStatement("UPDATE weather SET name = ?, description = ?, temp = ?, time = ? WHERE id = ?");
            ps.setString(1, weather.getName());
            ps.setString(2, weather.getDescription());
            ps.setString(3, weather.getTemperature());
            ps.setString(4,weather.getTime());
            ps.setInt(5, weather.getId());
            ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void deleteWeather(int id) {
        try {
            PreparedStatement ps = conn.prepareStatement("DELETE FROM weather WHERE id = ?");
            ps.setInt(1, id);
            ps.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public double getAverageTemperatureByCity(String city) {
        String sql = "SELECT AVG(REPLACE(temp, ',', '.')::double precision) AS avg_temp FROM weather WHERE name=?\n";
        try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, city);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    return rs.getDouble("avg_temp");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0.0; // или другое значение по умолчанию, если не удалось получить среднее значение
    }


}


package org.example.DB;

import java.util.List;

public interface WeatherDAO {
    void addWeather(Weather weather);
    void updateWeather(Weather weather);
    void deleteWeather(int id);
    List<Weather> getAllWeathers();
    Weather getWeatherById(int id);
}

package org.example.DB;


public class Weather {
    /** поле Id*/
    private int id;
    /** Поле name*/
    private String name;
    /** Поле description*/
    private String description;
    /** Поле температура*/
    private String temperature;
    /** Поле time*/
    private String time;

    /** Конструктор создания нового объекта с определёнными значениями
     *
     * @param id - id
     * @param name - название
     * @param description - состояние
     * @param temperature - температура
     * @param time - время
     */
    public Weather(int id, String name, String description, String temperature, String time) {
        this.id = id;
        this.name = name;
        this.description = description;
        this.temperature = temperature;
        this.time = time;
    }

// getters and setters

    /** Функция получения значения поля {@link Weather#id}*/
    public int getId() {
        return id;
    }

    /** Функция вставки значения поля {@link Weather#id}*/
    public void setId(int id) {
        this.id = id;
    }

    /** Функция получения значения поля {@link Weather#name}*/
    public String getName() {
        return name;
    }

    /** Функция вставки значения поля {@link Weather#name}*/
    public void setName(String name) {
        this.name = name;
    }

    /** Функция получения значения поля {@link Weather#description}*/
    public String getDescription() {
        return description;
    }

    /** Функция вставки значения поля {@link Weather#description}*/
    public void setDescription(String description) {
        this.description = description;
    }

    /** Функция получения значения поля {@link Weather#temperature}*/
    public String getTemperature() {
        return temperature;
    }

    /** Функция вставки значения поля {@link Weather#temperature}*/
    public void setTemperature(String temperature) {
        this.temperature = temperature;
    }

    /** Функция получения значения поля {@link Weather#time}*/
    public String getTime() {
        return time;
    }

    /** Функция вставки значения поля {@link Weather#time}*/
    public void setTime(String time) {
        this.time = time;
    }
}
