###Gitlab: controllo i branch protetti (e eventualmente toglie la protezione) dai gitlab nembro e azzano###

#Questo script passa in rassegna tutti i progetti esistenti sui gitlab satellite nembro e azzano per verificare la presenza di branch protetti che potrebbero impedire il corretto funzionamento dei mirror verso tali repo. Se necessario questo script può anche rimuovere la protezione da tali branch.

#importo file contenente configurazioni
. .\ApiGit\ApiGitResources\ApiScriptsConfig.ps1
#importo file contenente funzioni 
. .\ApiGit\ApiGitResources\ApiScriptsFunctions.ps1

#rilevo time per log inizio analisi
$startTime = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")
# avvio stopwatch
$mainStopWatch = [system.diagnostics.stopwatch]::StartNew()
#contatore ciclo do while
$startProj = 1
#numero massimo di progetti da analizzare
$endProj = 300
#conteggio progetti trovati
$existingProjects = 0
#conteggio progetti trovati
$protectedProjects = 0
#abilita o disabilita la cancellazione della protezione (1=cancella, 0=toca negot)
$deleteProtection = 1
#nome file di log
$logFile = "GitlabProtectedBranches.log"
#nome file old log
$oldLogFile = "GitlabProtectedBranches.old"

#creazione folder di Log se non già esistente
CheckLogFolder

#rotazione vecchio logFile da .log a .old se esiste
RotateOldLog

#scrivo intestazione e inizio analisi
WriteLogOutput $logFile 0 "--------------------"
Switch ($logLevel) {
    0 { WriteLogOutput $logFile 0 "LOG SINTETICO GITLAB PROTECTED_BRANCHES" }
    1 { WriteLogOutput $logFile 0 "LOG ERRORI GITLAB PROTECTED_BRANCHES" }
    2 { WriteLogOutput $logFile 0 "LOG FULL GITLAB PROTECTED_BRANCHES" }
    3 { WriteLogOutput $logFile 0 "LOG AMPOLLOSO PROTECTED_BRANCHES" }
}
WriteLogOutput $logFile 0 ""
WriteLogOutput $logFile 0 "Percorso log: $logFolder"
WriteLogOutput $logFile 0 ""
WriteLogOutput $logFile 0 "Inizio Esecuzione Script: $startTime"

$gitlabIstance = $destinationAzzano
$head = $azzanoHead
    #ciclo principale for che cicla da startProj a endProj
    for ($projectCount = $startProj; $projectCount -le $endProj; $projectCount++) {
        #chiamata api che restituisce informazioni sullo stato dei mirror
        $callUrl = "https://" + $gitlabIstance + "/api/v4/projects/" + $projectCount + "/protected_branches"
        try {
            #parsing della risposta api convertita da json
            $Response = Invoke-WebRequest -URI $callUrl -Headers $head -ContentType "application/json" -UseBasicParsing
            $parsedResponse = $Response.Content | ConvertFrom-Json
            #scrivo il numero del progetto
            WriteLogOutput $logFile 1 ""
            WriteLogOutput $logFile 1 "--------------------"
            WriteLogOutput $logFile 1 "**PROGETTO $projectCount $gitlabIstance**"
            foreach ($item in $parsedResponse) {
                WriteLogOutput $logFile 1 "Protected Branch Name: $($item.name) - Allow Force Push: $($item.allow_force_push)"
                $protectedProjects++
                if ($deleteProtection -eq 1) {
                    #nuovo URL x delete
                    $callUrlDelete = "https://" + $gitlabIstance + "/api/v4/projects/" + $projectCount + "/protected_branches/" + $item.name
                    #chiamo method DELETE
                    Invoke-WebRequest -Method Delete -URI $callUrlDelete -Headers $head -ContentType "application/json" -UseBasicParsing
                }
            }
            $existingProjects++
        }
        #scrivo se trovo un errore durante il try/catch
        catch {
            $parsedError = $_ | ConvertFrom-Json
            WriteLogOutput $logFile 3 ""
            WriteLogOutput $logFile 3 "--------------------"
            WriteLogOutput $logFile 3 "**ERRORE NEL PROGETTO $projectCount**"
            WriteLogOutput $logFile 3 $($parsedError.message)
        }
    #fine ciclo dei progetti
    }
# fermo stopwatch e calcolo durata script
$mainStopWatch.Stop()
$durataScript = $mainStopWatch.Elapsed.TotalSeconds

#rilevo time per log fine analisi
$endTime = (Get-Date).toString("yyyy/MM/dd HH:mm:ss")

#scrivo a video le statistiche
WriteLogOutput $logFile 0 ""
WriteLogOutput $logFile 0 "PROGETTI ANALIZZATI: $existingProjects"
WriteLogOutput $logFile 0 ""
WriteLogOutput $logFile 0 "PROGETTI CON BRANCH PROTETTI: $protectedProjects"
WriteLogOutput $logFile 0 ""
WriteLogOutput $logFile 0 "Fine Esecuzione Script: $endTime"
WriteLogOutput $logFile 0 ""
WriteLogOutput $logFile 0 "Durata Esecuzione Script: $durataScript secondi"
WriteLogOutput $logFile 0 ""