diff --git a/README.md b/README.md index 4d96d56..04554fa 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ Before you begin, ensure you have the following installed: * Navigate to the "WAR file to deploy" section. * Choose the `shorten.war` file using the file upload button. * Click the "Deploy" button. -3. **Configure environment variables:** +3. **Configure Variables on deployed war:** Set environment variables for cloud-specific settings. @@ -246,7 +246,27 @@ Wait until the pod is in the "Running" state. Access your application using the provided external IP. +### SMS Service Configuration +To configure the SMS service, you need to specify parameters related to the SMS provider in the `application.properties` file. + +* #### Managed SMS Provider (Uses HttpSms API from https://httpsms.com/) + * Generate API Key : https://httpsms.com/settings/ + * HttpSms API Docs : https://api.httpsms.com/ + + ```properties + sms.provider=managed + managed.sms.api.key=your_managed_sms_api_key + managed.sms.phone-number=123456789 + +* #### Self-hosted SMS Provider (Host our open source android-based SMS web gateway : https://api.httpsms.com/) + + ```properties + sms.provider=selfhosted + selfhosted.gateway.url=https://your-smsgateway-url/index.php + selfhosted.device.id=your_device_id + selfhosted.hash=your_device_hash + ### App Health * Check application status from the /monitoring page example http://localhost:8080/monitoring diff --git a/src/main/java/com/bitmutex/shortener/SmsService.java b/src/main/java/com/bitmutex/shortener/SmsService.java index 911df8b..d14aa85 100644 --- a/src/main/java/com/bitmutex/shortener/SmsService.java +++ b/src/main/java/com/bitmutex/shortener/SmsService.java @@ -5,41 +5,88 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.net.URI; +import java.net.URLEncoder; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; + @Service public class SmsService { + private final SmsServiceConfig smsServiceConfig; + private static final Logger logger = LoggerFactory.getLogger(SmsService.class); + public SmsService(SmsServiceConfig smsServiceConfig) { + this.smsServiceConfig = smsServiceConfig; + } + public void sendSms(String toNumber, String message) { try { - // Send the SMS to the user (you need to implement this part) - var client = HttpClient.newHttpClient(); - var apiKey = "Vucf1nCa4ed-AMNGv6CnsycfQT28yLUA8NEvY7IZ87-Piv855UBcjfo29Zb8XPZt"; - - String payload = "{\n" + - " \"content\": \"" + message + "\",\n" + // Use concatenation for variables - " \"from\": \"+9038556097\",\n" + - " \"to\": \"" + toNumber + "\"\n" + - "}"; - - var requestBuild = HttpRequest.newBuilder() - .uri(URI.create("https://api.httpsms.com/v1/messages/send")) - .header("accept", "application/json") - .header("Content-Type", "application/json") - .header("x-api-key", apiKey) - .POST(HttpRequest.BodyPublishers.ofString(payload)) - .build(); - - var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString()); - System.out.println(response.body()); + if ("managed".equals(smsServiceConfig.getSmsProvider())) { + sendSmsToManagedProvider(toNumber, message); + } else if ("selfhosted".equals(smsServiceConfig.getSmsProvider())) { + sendSmsToSelfHostedGateway(toNumber, message); + } else { + logger.error("Invalid SMS provider configuration"); + } logger.info("SMS sent successfully to {}", toNumber); - logger.debug("SMS API response: {}", response.body()); } catch (Exception e) { // Log and handle SMS sending failure logger.error("Failed to send SMS to {}: {}", toNumber, e.getMessage(), e); } } -} + + private void sendSmsToManagedProvider(String toNumber, String message) throws Exception { + var client = HttpClient.newHttpClient(); + + var apiKey = smsServiceConfig.getManagedSmsApiKey(); + var phoneNumber = smsServiceConfig.getManagedPhoneNumber(); + + String payload = "{\n" + + " \"content\": \"" + message + "\",\n" + + " \"from\": \"+"+ phoneNumber + "\",\n" + + " \"to\": \"" + toNumber + "\"\n" + + "}"; + + var requestBuild = HttpRequest.newBuilder() + .uri(URI.create("https://api.httpsms.com/v1/messages/send")) + .header("accept", "application/json") + .header("Content-Type", "application/json") + .header("x-api-key", apiKey) + .POST(HttpRequest.BodyPublishers.ofString(payload)) + .build(); + + var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString()); + System.out.println(response.body()); + logger.info("External SMS API response: {}", response.body()); + } + + private void sendSmsToSelfHostedGateway(String toNumber, String message) throws Exception { + // Replace with your actual SMSGateway server URL, device ID, and hash + + String gatewayUrl = smsServiceConfig.getSelfHostedGatewayUrl(); + String deviceId = smsServiceConfig.getSelfHostedDeviceId(); + String hash = smsServiceConfig.getSelfHostedHash(); + + // Encode special characters in the message + String encodedMessage = URLEncoder.encode(message, StandardCharsets.UTF_8.toString()); + + // Build the final URL + var finalUrl = String.format("%s?id=%s&h=%s&to=%s&message=%s", gatewayUrl, deviceId, hash, toNumber, encodedMessage); + + var client = HttpClient.newHttpClient(); + + var requestBuild = HttpRequest.newBuilder() + .uri(URI.create(finalUrl)) + .header("accept", "application/json") + .header("Content-Type", "application/json") + .GET() + .build(); + + var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString()); + System.out.println(response.body()); + logger.info("SMSGateway API response: {}", response.body()); + } +} \ No newline at end of file diff --git a/src/main/java/com/bitmutex/shortener/SmsServiceConfig.java b/src/main/java/com/bitmutex/shortener/SmsServiceConfig.java new file mode 100644 index 0000000..61c806e --- /dev/null +++ b/src/main/java/com/bitmutex/shortener/SmsServiceConfig.java @@ -0,0 +1,50 @@ +package com.bitmutex.shortener; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SmsServiceConfig { + + @Value("${sms.provider}") + private String smsProvider; + + @Value("${managed.sms.api.key}") + private String managedSmsApiKey; + + @Value("${managed.sms.phone-number}") + private String managedPhoneNumber; + + @Value("${selfhosted.gateway.url}") + private String selfHostedGatewayUrl; + + @Value("${selfhosted.device.id}") + private String selfHostedDeviceId; + + @Value("${selfhosted.hash}") + private String selfHostedHash; + + public String getSmsProvider() { + return smsProvider; + } + + public String getManagedPhoneNumber() { + return managedPhoneNumber; + } + + public String getManagedSmsApiKey() { + return managedSmsApiKey; + } + + public String getSelfHostedGatewayUrl() { + return selfHostedGatewayUrl; + } + + public String getSelfHostedDeviceId() { + return selfHostedDeviceId; + } + + public String getSelfHostedHash() { + return selfHostedHash; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5163d9c..11a9072 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -91,9 +91,20 @@ springdoc.api-docs.path=/docs springdoc.swagger-ui.path=/docs-ui springdoc.swagger-ui.operationsSorter=method springdoc.show-actuator=true - +#Springdoc Swagger Config springdoc.swagger-ui.oauthClientId=Iv1.8d3d0ea51b7e7da3 springdoc.swagger-ui.oauthClientSecret=2176086761d073b2082afdc4af0207fa7d1d274b springdoc.swagger-ui.oauthAppName=Bitmutex Shortener springdoc.swagger-ui.oauthScopeSeparator=/v springdoc.swagger-ui.showRequestHeaders=true + + +# SMS Provider Configuration (managed/selfhosted) +sms.provider=selfhosted +# For Managed SMS Provider (uses httpSms API from https://httpsms.com/settings) +managed.sms.api.key=Vucf1nCa4ed-AMNGv6CnsycfQT28yLUA8NEvY7IZ87-Piv855UBcjfo29Zb8XPZt +managed.sms.phone-number=9038556097 +# For Self-Hosted SMSGateway (android app url : https://bitmutexsms.000webhostapp.com/index.php?id=f0edf9a81c2461b5&h=b4132c) +selfhosted.gateway.url=https://bitmutexsms.000webhostapp.com/index.php +selfhosted.device.id=f0edf9a81c2461b5 +selfhosted.hash=b4132c diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index 44d73d2..098ca5a 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -17,10 +17,13 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - ${LOG_ARCHIVE}/shortener.log.%d{yyyy-MM-dd}.log + + ${LOG_PATH}/shortener.log.%d{yyyy-MM-dd}.%i.zip + 1 + 4 + 30 - 10MB + 5MB 1GB true @@ -33,7 +36,7 @@ - +