mirror of https://github.com/statping/statping
				
				
				
			
		
			
				
	
	
		
			275 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Go
		
	
	
// +build ignore
 | 
						|
 | 
						|
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"github.com/statping/statping/utils"
 | 
						|
	"github.com/tdewolff/minify/v2"
 | 
						|
	"github.com/tdewolff/minify/v2/html"
 | 
						|
	"os"
 | 
						|
	"time"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	mjmlApplication string
 | 
						|
	mjmlPrivate     string
 | 
						|
)
 | 
						|
 | 
						|
func main() {
 | 
						|
	utils.InitEnvs()
 | 
						|
 | 
						|
	mjmlApplication = os.Getenv("MJML_APP")
 | 
						|
	mjmlPrivate = os.Getenv("MJML_PRIVATE")
 | 
						|
 | 
						|
	if mjmlApplication == "" || mjmlPrivate == "" {
 | 
						|
		fmt.Println("skipping email MJML template render, missing MJML_APP and MJML_PRIVATE")
 | 
						|
		return
 | 
						|
	}
 | 
						|
 | 
						|
	fmt.Println("Generating success/failure email templates from MJML to a HTML golang constant")
 | 
						|
 | 
						|
	success := convertMJML(emailSuccessMJML)
 | 
						|
	fail := convertMJML(emailFailureMJML)
 | 
						|
 | 
						|
	htmlOut := `// DO NOT EDIT ** This file was generated with go generate on ` + utils.Now().String() + ` ** DO NOT EDIT //
 | 
						|
package notifiers
 | 
						|
 | 
						|
const emailSuccess = ` + minimize(success) + `
 | 
						|
 | 
						|
const emailFailure = ` + minimize(fail) + `
 | 
						|
 | 
						|
`
 | 
						|
 | 
						|
	utils.SaveFile("email_rendered.go", []byte(htmlOut))
 | 
						|
 | 
						|
	fmt.Println("Email MJML to HTML const saved: notifiers/email_rendered.go")
 | 
						|
}
 | 
						|
 | 
						|
type mjmlInput struct {
 | 
						|
	Mjml string `json:"mjml"`
 | 
						|
}
 | 
						|
 | 
						|
func minimize(val string) string {
 | 
						|
	m := minify.New()
 | 
						|
	m.Add("text/html", &html.Minifier{
 | 
						|
		KeepDefaultAttrVals: true,
 | 
						|
	})
 | 
						|
	s, err := m.String("text/html", val)
 | 
						|
	if err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
 | 
						|
	return fmt.Sprintf("`%s`", s)
 | 
						|
}
 | 
						|
 | 
						|
func convertMJML(mjml string) string {
 | 
						|
	input, _ := json.Marshal(mjmlInput{mjml})
 | 
						|
	auth := fmt.Sprintf("%s:%s", mjmlApplication, mjmlPrivate)
 | 
						|
	resp, _, err := utils.HttpRequest("https://"+auth+"@api.mjml.io/v1/render", "POST", "application/json", nil, bytes.NewBuffer(input), 15*time.Minute, false, nil)
 | 
						|
	if err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
	var respData mjmlApi
 | 
						|
	if err := json.Unmarshal(resp, &respData); err != nil {
 | 
						|
		panic(err)
 | 
						|
	}
 | 
						|
	return respData.Html
 | 
						|
}
 | 
						|
 | 
						|
type mjmlApi struct {
 | 
						|
	Html    string `json:"html"`
 | 
						|
	Mjml    string `json:"mjml"`
 | 
						|
	Version string `json:"mjml_version"`
 | 
						|
}
 | 
						|
 | 
						|
const emailFailureMJML = `<mjml>
 | 
						|
  <mj-head>
 | 
						|
    <mj-title>Statping Service Notification</mj-title>
 | 
						|
  </mj-head>
 | 
						|
  <mj-body background-color="#E7E7E7">
 | 
						|
    <mj-raw>
 | 
						|
      <!-- Top Bar -->
 | 
						|
    </mj-raw>
 | 
						|
    <mj-section background-color="#a30911" background-url="https://assets.statping.com/offlinebanner.png" padding="0px">
 | 
						|
      <mj-column>
 | 
						|
        <mj-image width="45px" href="https://statping.com" src="https://assets.statping.com/iconlight.png" align="center" alt="Sphero"></mj-image>
 | 
						|
      </mj-column>
 | 
						|
    </mj-section>
 | 
						|
  
 | 
						|
    <mj-section background-color="#ffffff">
 | 
						|
      <mj-column width="100%">
 | 
						|
        <mj-text font-family="Ubuntu, Helvetica, Arial, sans-serif" font-size="22px" padding="15px" line-height="30px">
 | 
						|
         {{.Service.Name}} is currently offline, you might want to check it.
 | 
						|
        </mj-text>
 | 
						|
        
 | 
						|
        
 | 
						|
            <mj-section padding-left="0px" padding-right="0px" padding-top="10px" padding-bottom="10px">
 | 
						|
        <mj-column>
 | 
						|
          <mj-text font-color="#d50d0d" align="center" font-size="20px" color="#626262">Offline for {{.Service.Downtime.Human}}</mj-text>
 | 
						|
          
 | 
						|
          <mj-button border-radius="4px" background-color="#cb121c" href="{{.Core.Domain}}/service/{{.Service.Id}}">View Dashboard</mj-button>
 | 
						|
          
 | 
						|
    </mj-column>
 | 
						|
  </mj-section>
 | 
						|
        
 | 
						|
       
 | 
						|
    <mj-raw>
 | 
						|
      <!-- Bottom Graphic -->
 | 
						|
    </mj-raw>
 | 
						|
    
 | 
						|
        
 | 
						|
        
 | 
						|
   
 | 
						|
  <mj-section padding="0px" background-color="#fafafa">
 | 
						|
        <mj-column>
 | 
						|
          <mj-text font-size="20px" color="#626262">Service Domain</mj-text>
 | 
						|
          <mj-text padding-top="0px" font-size="14px" color="#626262">{{.Service.Domain}}</mj-text>
 | 
						|
    </mj-column>
 | 
						|
  </mj-section>
 | 
						|
    
 | 
						|
    <mj-section padding="0px"  background-color="#ffffff">
 | 
						|
        <mj-column>
 | 
						|
          <mj-text font-size="20px" color="#626262">Current Issue</mj-text>
 | 
						|
          <mj-text padding-top="0px" font-size="14px" color="#626262">{{.Failure.Issue}}</mj-text>
 | 
						|
    </mj-column>
 | 
						|
  </mj-section>
 | 
						|
    
 | 
						|
   
 | 
						|
 <mj-spacer height="30px" />
 | 
						|
        
 | 
						|
    <mj-section padding="0" background-url="https://assets.statping.com/offlinebanner.png" background-color="#a30911">
 | 
						|
      <mj-column>
 | 
						|
        <mj-image width="250px" href="https://www.sphero.com" src="https://assets.statping.com/statpingcom.png" align="center"></mj-image>
 | 
						|
      </mj-column>
 | 
						|
    </mj-section>
 | 
						|
        
 | 
						|
         <mj-section padding-bottom="0" padding-top="10px">
 | 
						|
        <mj-column>
 | 
						|
        <mj-text color="#445566" font-size="11px" align="center" line-height="16px">
 | 
						|
            You are receiving this email because one of your services has changed on your Statping instance. You can modify this email on the Email Notifier page in Settings.
 | 
						|
          </mj-text>
 | 
						|
          <mj-text color="#445566" font-size="11px" align="center" line-height="16px">
 | 
						|
            © Statping
 | 
						|
          </mj-text>
 | 
						|
        </mj-column>
 | 
						|
      </mj-section>
 | 
						|
        
 | 
						|
         <mj-section padding-top="0" padding-bottom="0">
 | 
						|
        <mj-group>
 | 
						|
          <mj-column width="100%" padding-right="0">
 | 
						|
            <mj-text color="#445566" font-size="11px" align="center" line-height="16px" font-weight="bold">
 | 
						|
              <a class="footer-link" href="https://statping.com">Statping.com</a>         
 | 
						|
              
 | 
						|
              <a class="footer-link" href="https://github.com/statping/statping">Github</a>        
 | 
						|
              
 | 
						|
              <a class="footer-link" href="https://statping.com/privacy">Privacy</a>        
 | 
						|
              
 | 
						|
              <a class="footer-link" href="https://news.statping.com/delete?email={{.Email}}">Unsubscribe</a>
 | 
						|
            </mj-text>
 | 
						|
          </mj-column>
 | 
						|
        </mj-group>
 | 
						|
 | 
						|
      </mj-section>
 | 
						|
      </mj-column>
 | 
						|
    </mj-section>
 | 
						|
        
 | 
						|
  </mj-body>
 | 
						|
</mjml>`
 | 
						|
 | 
						|
const emailSuccessMJML = `<mjml>
 | 
						|
  <mj-head>
 | 
						|
    <mj-title>Statping Service Notification</mj-title>
 | 
						|
  </mj-head>
 | 
						|
  <mj-body background-color="#E7E7E7">
 | 
						|
    <mj-raw>
 | 
						|
      <!-- Top Bar -->
 | 
						|
    </mj-raw>
 | 
						|
    <mj-section background-color="#12ab0c" background-url="https://assets.statping.com/greenbackground.png" padding="0px">
 | 
						|
      <mj-column>
 | 
						|
        <mj-image width="45px" href="https://statping.com" src="https://assets.statping.com/iconlight.png" align="center" alt="Sphero"></mj-image>
 | 
						|
      </mj-column>
 | 
						|
    </mj-section>
 | 
						|
  
 | 
						|
    <mj-section background-color="#ffffff">
 | 
						|
      <mj-column width="100%">
 | 
						|
        <mj-text font-family="Ubuntu, Helvetica, Arial, sans-serif" font-size="22px" padding="15px" line-height="30px">
 | 
						|
         {{.Service.Name}} is currently offline, you might want to check it.
 | 
						|
        </mj-text>
 | 
						|
        
 | 
						|
        
 | 
						|
            <mj-section padding-left="0px" padding-right="0px" padding-top="10px" padding-bottom="10px">
 | 
						|
        <mj-column>
 | 
						|
          <mj-text font-color="#d50d0d" align="center" font-size="20px" color="#626262">Offline for {{.Service.Downtime.Human}}</mj-text>
 | 
						|
          
 | 
						|
          <mj-button border-radius="4px" background-color="#4caf50" href="{{.Core.Domain}}/service/{{.Service.Id}}">View Dashboard</mj-button>
 | 
						|
          
 | 
						|
    </mj-column>
 | 
						|
  </mj-section>
 | 
						|
        
 | 
						|
       
 | 
						|
    <mj-raw>
 | 
						|
      <!-- Bottom Graphic -->
 | 
						|
    </mj-raw>
 | 
						|
    
 | 
						|
        
 | 
						|
        
 | 
						|
   
 | 
						|
  <mj-section padding="0px" background-color="#fafafa">
 | 
						|
        <mj-column>
 | 
						|
          <mj-text font-size="20px" color="#626262">Service Domain</mj-text>
 | 
						|
          <mj-text padding-top="0px" font-size="14px" color="#626262">{{.Service.Domain}}</mj-text>
 | 
						|
    </mj-column>
 | 
						|
  </mj-section>
 | 
						|
    
 | 
						|
    <mj-section padding="0px"  background-color="#ffffff">
 | 
						|
        <mj-column>
 | 
						|
          <mj-text font-size="20px" color="#626262">Current Issue</mj-text>
 | 
						|
          <mj-text padding-top="0px" font-size="14px" color="#626262">{{.Failure.Issue}}</mj-text>
 | 
						|
    </mj-column>
 | 
						|
  </mj-section>
 | 
						|
    
 | 
						|
   
 | 
						|
 <mj-spacer height="30px" />
 | 
						|
        
 | 
						|
    <mj-section padding="0" background-url="https://assets.statping.com/greenbackground.png" background-color="#12ab0c">
 | 
						|
      <mj-column>
 | 
						|
        <mj-image width="250px" href="https://www.sphero.com" src="https://assets.statping.com/statpingcom.png" align="center"></mj-image>
 | 
						|
      </mj-column>
 | 
						|
    </mj-section>
 | 
						|
        
 | 
						|
         <mj-section padding-bottom="0" padding-top="10px">
 | 
						|
        <mj-column>
 | 
						|
        <mj-text color="#445566" font-size="11px" align="center" line-height="16px">
 | 
						|
            You are receiving this email because one of your services has changed on your Statping instance. You can modify this email on the Email Notifier page in Settings.
 | 
						|
          </mj-text>
 | 
						|
          <mj-text color="#445566" font-size="11px" align="center" line-height="16px">
 | 
						|
            © Statping
 | 
						|
          </mj-text>
 | 
						|
        </mj-column>
 | 
						|
      </mj-section>
 | 
						|
        
 | 
						|
         <mj-section padding-top="0" padding-bottom="0">
 | 
						|
        <mj-group>
 | 
						|
          <mj-column width="100%" padding-right="0">
 | 
						|
            <mj-text color="#445566" font-size="11px" align="center" line-height="16px" font-weight="bold">
 | 
						|
              <a class="footer-link" href="https://statping.com">Statping.com</a>         
 | 
						|
              
 | 
						|
              <a class="footer-link" href="https://github.com/statping/statping">Github</a>        
 | 
						|
              
 | 
						|
              <a class="footer-link" href="https://statping.com/privacy">Privacy</a>        
 | 
						|
              
 | 
						|
              <a class="footer-link" href="https://news.statping.com/delete?email={{.Email}}">Unsubscribe</a>
 | 
						|
            </mj-text>
 | 
						|
          </mj-column>
 | 
						|
        </mj-group>
 | 
						|
 | 
						|
      </mj-section>
 | 
						|
      </mj-column>
 | 
						|
    </mj-section>
 | 
						|
        
 | 
						|
  </mj-body>
 | 
						|
</mjml>`
 |